LINK

题意

给定一个只包含 a , b , c a,b,c a,b,c三种字母的字符串

你需要修改最少的字母(修改为a,b,c),使得修改后的字符串不存在长度至少为 2 2 2的回文串

求最小的修改次数


不能有长度为 2 2 2的回文,也就是不能有连续字母出现

不能有长度为 3 3 3的回文,设前两个字母是ab,那么第三个字母只能是c

于是可以发现,字符串一定是abc,acb,bac,bca,cab,cba循环中的一种

对这 6 6 6种可能分别求一遍代价的前缀和即可,实现起来略有技巧

#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e5+10;
char s[maxn];
int n,m;
int main()
{
	cin >> n >> m >> ( s+1 );
	vector<vector<int> >vec;
	for(char a:{'a','b','c'} )
	for(char b:{'a','b','c'} )
	for(char c:{'a','b','c'} )
	{
		if( a==b || a==c || b==c )	continue;
		vector<int>temp(n+2,0);
		vec.push_back( temp );
		for(int i=1;i<=n;i++)
		{
			char w = i%3==0?a:( i%3==1?b:c );
			vec.back()[i] = vec.back()[i-1]+( w!=s[i] );
		}	
	}
	while( m-- )
	{
		int l,r,ans = 1e9; cin >> l >> r;
		for(auto &v:vec )	ans = min( ans,v[r]-v[l-1] );	
		cout << ans << endl;
	}	
}