回文串

题目:

给你一个只由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         } 

 

posted @ 2021-08-04 13:42  starlightlmy  阅读(337)  评论(0)    收藏  举报