题目链接: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;
}