题目链接
这个题虽然是div2 D但是却非常简单
题意:
题目给定字符串只涵 a,b,c三种字母考虑漂亮的字符串不存在大于等于2的回文子串。给定区间**[L,R]**求区间最小修改数。
题解:
考虑对于每个 s[i] 要使得 s[i] 不回文,s[i]!=s[i-1] 则无法形成 “aa” 这种结构。
若 s[i]!=s[i-2] 则无法形成 “aba” 这种结构且只有三种字母
所以答案很明显把子串修改为 “abcabca…”,“bacbac…” 这种循环结构。
循环节分别为 abc,acb,bac,bca,cab,cba。
最后考虑字符串 s 变为哪个相同位置字母越多,修改花费就最小就行。
代码
#include<bits/stdc++.h>
using namespace std;
string s[7];
int sum[7][N];
int main() {
int n,m;
cin>>n>>m;
s[1]="abc",s[2]="acb",s[3]="bac",s[4]="bca",s[5]="cab",s[6]="cba";
for(int i=1;i<=n;i++) {
char ch;
cin>>ch;
for(int j=1;j<=6;j++) {
sum[j][i]=sum[j][i-1]+(s[j][(i-1)%3]==ch);
}
}
while(m--) {
int l,r,ans=0;
cin>>l>>r;
for(int i=1;i<=6;i++) {
ans=max(ans,sum[i][r]-sum[i][l-1]);
}
cout<<(r-l+1-ans)<<endl;
}
return 0;
}