第十八届浙大城市学院程序设计竞赛(同步赛)F

第十八届浙大城市学院程序设计竞赛(同步赛)F

大意

略。。

思路

难在对复杂度的分析上。。然而暴力写错-5(

因为只能恰好删除两个,所以只有以下几种情况

  1. 遇到某个不匹配的位置,两边全部删除

  2. 先删左边再删右边

  3. 先删右边再删左边

因为是回文串,所以当从外朝里暴力配对时遇到不相等的字符,是一定要删除的,所以最多只有5种情况

复杂度自然是对的。

如果匹配完成时还剩一次删除,那么无论奇数偶数,都把中间的删掉自然就可以。

代码

#include <map>
#include <set>
#include <cmath>
#include <queue>
#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

#define ll long long
#define ull unsigned long long
#define cint const int&
#define Pi acos(-1)

const int mod = 1e9+7;
const int inf_int = 0x7fffffff;
const ll inf_ll = 0x7fffffffffffffff;
const double ept = 1e-9;

int t;
int n;
string s;
bool flag;

void dfs(cint l, cint r, cint num) {
    if(l >= r) {
        flag = 1;
        return;
    }
    if(s[l] == s[r]) {
        dfs(l+1, r-1, num);
    } else if(num > 0){
        dfs(l+1, r, num-1);
        if(!flag) dfs(l, r-1, num-1);
    }
}

int main() {
    cin >> t;
    while(t--) {
        flag = 0;
        cin >> n >> s;
        dfs(0, n-1, 2);
        if(flag) cout << "Yes" << endl;
        else cout << "No" << endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/ullio/p/14596548.html