Codeforces 676C Vasya and String(尺取法)

题目大概说给一个由a和b组成的字符串,最多能改变其中的k个字符,问通过改变能得到的最长连续且相同的字符串是多长。

用尺取法,改变成a和改变成b分别做一次:双指针i和j,j不停++,然后如果遇到需要改变且改变次数用完就让i++更正改变次数,最后更新答案。时间复杂度O(n)。

另外,注意到k=0的情况。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 char str[111111];
 6 int main(){
 7     int n,k;
 8     scanf("%d%d%s",&n,&k,str);
 9     int i=0,j=0,tmpn=0,tmpk=0,ans=0;
10     while(j<n){
11         if(str[j]=='a'){
12             ++tmpn;
13         }else if(k==0){
14             tmpn=0;
15         }else{
16             while(tmpk==k){
17                 if(str[i]=='b'){
18                     --tmpk;
19                 }
20                 --tmpn;
21                 ++i;
22             }
23             ++tmpk;
24             ++tmpn;
25         }
26         ans=max(ans,tmpn);
27         ++j;
28     }
29     i=0; j=0; tmpn=0; tmpk=0;
30     while(j<n){
31         if(str[j]=='b'){
32             ++tmpn;
33         }else if(k==0){
34             tmpn=0;
35         }else{
36             while(tmpk==k){
37                 if(str[i]=='a'){
38                     --tmpk;
39                 }
40                 --tmpn;
41                 ++i;
42             }
43             ++tmpk;
44             ++tmpn;
45         }
46         ans=max(ans,tmpn);
47         ++j;
48     }
49     printf("%d",ans);
50     return 0;
51 }
原文地址:https://www.cnblogs.com/WABoss/p/5666982.html