题目链接:http://codeforces.com/gym/101778/problem/H
题意:给出长度为n的字符串,要进行m次的修改,每次修改将指定位置的字符改为新给的字符。问有哪些修改能使得字符串变为回文串。
解析:题目每次修改直接判断回文超时,这里标记每个点是不是使得字符串不是回文串的点,以及影响回文的点的个数,当没有点会影响字符串成为回文串时,结果数加一,这里用cin也会超时
代码:
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int M=1e5+7; int n,m,num,len; char str[M]; bool vis[M]; void solve() { num=0; for(int i=0;i<len/2;i++) { if(str[i]!=str[len-1-i]) { vis[i]=false; num++; }else{ vis[i]=true; } } if(len%2==1) { vis[len/2]=true; } } int main() { int T,pos; char op; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); scanf("%s",str); len=strlen(str); solve(); int ans=0; while(m--) { scanf("%d %c",&pos,&op); pos--; str[pos]=op; if(pos<len/2) { if(str[pos]!=str[len-1-pos]) { if(vis[pos]) { vis[pos]=false; num++; } }else { if(!vis[pos]) { vis[pos]=true; num--; } } } if(pos>=len/2) { if(str[pos]!=str[len-1-pos]) { if(vis[len-1-pos]) { vis[len-1-pos]=false; num++; } }else{ if(!vis[len-1-pos]) { vis[len-1-pos]=true; num--; } } } if(num==0) ans++; } printf("%d\n",ans); } return 0; }