回文串
题目:
给你一个只由abc构成的字符串,改动其中的字符(只能改成abc,可能不用改)使得没有任何一个子串(长度>=2)是回文串。
来源:
Educational Codeforces Round 112 D
前置芝士:
回文串性质
1.每两个连续字符都不相同(eg.aa/ee)
2.每三个连续字符都不满足 eg.aba/wtw
思路:
容易发现,每三个连续的字符都是不一样的,且s[i] = s[i+3]
这时只需要分别记录s和由abcabc.../acbacb.../bca.../bac.../cab.../cba...组成的字符串最小的不一样的个数,即为ans
写法上注意
对s进行预处理,而不是对每个读进来的子串进行操作(会TLE)
code:
1 char str[7][4]={"abc","acb","bca","bac","cab","cba"}; 2 3 scanf("%d%d",&n,&m); 4 scanf("%s",s+1); 5 for(int i=1;i<=n;i++){ 6 for(int j=0;j<6;j++){ 7 cnt[i][j]=cnt[i-1][j]+(s[i]==str[j][i%3]); 8 } 9 } 10 while(m--){ 11 scanf("%d%d",&l,&r); 12 int ans=0; 13 for(int i=0;i<6;i++){ 14 ans=max(ans,cnt[r][i]-cnt[l-1][i]); 15 } 16 printf("%d\n",r-l+1-ans); 17 }

浙公网安备 33010602011771号