CF1466C Canine poetry
题目大意
每组数据给出一个由小写字母组成的字符串 \(\rm str\)。
每次可以将串 \(\rm str\) 中任意一个位置的字符修改为另一个小写字母。
问最少要修改多少次,才可以使得串 \(\rm str\) 中 不存在长度大于 \(1\) 的回文子串。
题目分析
一个回文串的长度只会是奇数或偶数,那么回文串的类型也分两种(名字自己起的):
-
奇串
-
偶串
奇串
这种情况中,回文串的中心地带一定是一个长度为 \(3\) 的回文奇串。
那么把这个回文奇串随意破坏左右端的任一个即可;
偶串
这种情况中,回文串的中心地带一定是一个长度为 \(2\) 的回文偶串。
那么把这个回文偶串随意破坏左右任一个即可。
那么我们如何处理 『破坏』 操作呢?可以手动更改,但更方便的方式是打个标记。
代码
const int ma=100005;
bool vis[ma];
int main(void)
{
std::ios::sync_with_stdio(false);
int T;
cin>>T;
while(T--)
{
string str;
cin>>str;
int n=str.size();
memset(vis,false,sizeof(vis));
int ans=0;
for(register int i=0;i<n-1;i++)
{
if(str[i]==str[i+2] && vis[i]==false)//3 - 情况
{
vis[i+2]=true;
ans++;
}
if(str[i]==str[i+1] && vis[i]==false)//2 - 情况
{
vis[i+1]=true;
ans++;
}
}
printf("%d\n",ans);
}
return 0;
}

浙公网安备 33010602011771号