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;
}
posted @ 2021-10-06 22:32  Coros_Trusds  阅读(42)  评论(0)    收藏  举报