D. Say No to Palindromes
题意:
给定只包含a,b,c的字符串长度为n
提供m次询问,每个询问一个区间l,r
问需要修改最少的字母(修改为a,b,c)使得修改后的字符串不存在长度至少为2的回文串
求最小的修改数
————————————————————————————————
因此si≠si+1 (因为它是长度的回文2)和si≠si+2(因为它是长度的回文3),又因为只包含a,b,c,所以si=si+3。
于是发现字符串是abc,acb,bac,bca,cab,cba循环中的一种
那么对这6中情况分别求一遍前缀和即可
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=200010;
char a[N];
int n,m;
int pre[6][N];
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin>>n>>m;
cin>>a+1;
string s[6]={"abc","acb","bac","bca","cab","cba"};
for(int i=0;i<6;i++)
for(int j=0;j<n;j++)
{
pre[i][j+1]=pre[i][j]+(s[i][(j+1)%3]!=a[j+1]);
}
while(m--)
{
int l,r;
cin>>l>>r;
int ans=n;
for(int i=0;i<6;i++)
ans=min(ans,pre[i][r]-pre[i][l-1]);
cout<<ans<<endl;
}
return 0;
}