码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces 676C Vasya and String(尺取法)

时间:2016-07-13 15:42:49      阅读:104      评论:0      收藏:0      [点我收藏+]

标签:

题目大概说给一个由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 }

 

Codeforces 676C Vasya and String(尺取法)

标签:

原文地址:http://www.cnblogs.com/WABoss/p/5666982.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!