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 }
时间: 2024-11-03 02:01:13

Codeforces 676C Vasya and String(尺取法)的相关文章

HDU 5672 String 尺取法追赶法

String Problem Description There is a string S.S only contain lower case English character.(10≤length(S)≤1,000,000)How many substrings there are that contain at least k(1≤k≤26) distinct characters? Input There are multiple test cases. The first line

hdu-5672 String(尺取法)

题目链接: String Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) 问题描述 有一个 10\leq10≤长度\leq 1,000,000≤1,000,000 的字符串,仅由小写字母构成.求有多少个子串,包含有至少k(1 \leq k \leq 26)k(1≤k≤26)个不同的字母? 输入描述 输入包含多组数据. 第一行有一个整数T (1\leq T\leq 10)T(1≤T≤1

CodeForces 701C They Are Everywhere 尺取法

简单的尺取法…… 先找到右边界 然后在已经有了所有字母后减小左边界…… 不断优化最短区间就好了~ 1 #include<stdio.h> 2 #include<string.h> 3 #define M(a,b) memset(a,b,sizeof(a)) 4 char a[200005]; 5 int zimu[205]; 6 int zimu1[205]; 7 bool in[205]; 8 int sum; 9 int main(){ 10 int n; 11 while(~

Codeforces 660C Hard Process(尺取法)

题目大概说给一个由01组成的序列,要求最多把k个0改成1使得连续的1的个数最多,输出一种方案. 和CF 676C相似. 1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 int a[333333]; 5 int main(){ 6 int n,k; 7 scanf("%d%d",&n,&k); 8 for(int i=0; i<n; ++i){ 9 scanf

【CF676C】Vasya and String(二分查找,线性扫描尺取法)

题意: 给出一个长度为n的字符串,只有字符'a'和'b'.最多能改变k个字符,即把'a'变成'b'或把'b'变成'a'. 问改变后的最长连续相同字符的字串长度为多少. 首先是二分查找,好想也好写 1 var s:array[0..100000]of longint; 2 ch:ansistring; 3 n,k,i,l,r,mid,last,ans:longint; 4 5 function max(x,y:longint):longint; 6 begin 7 if x>y then exit

河老师的新年礼物(尺取法)

河老师的新年礼物 发布时间: 2017年1月1日 15:11   最后更新: 2017年1月1日 15:13   时间限制: 1000ms   内存限制: 256M 描述 河老师的新年礼物是一个长度为n的ab串,他想要找出最长的一个子串使得这个子串中每个字符都相等,他称之为“最优子串”.当然对河老师来说这个问题太简单了,于是他加了一个条件:他可以改变这个串中的某些字符,但一次只能改变一个字符,最多能改变k次.河老师想要知道,在可以对串进行改变的前提下,这个ab串的“最优子串”的长度是多少. 输入

尺取法总结

最近在做尺取法,总结一下 尺取法,说白了就是一个st,ed:这两个左右端点(起点.终点)在运动,适用条件就是要求一段连续的区间, 并且st(左端点)++的时候,一个更优的ed一定要大于或者等于原来的ed 所以尺取法是一种高效的枚举区间的方法,一般用于求取有一定限制的区间个数或最短的区间等等. 而且经常与map.set.multiset等连用 这里推荐几道题: 1.poj3061 #include<stdio.h> #include<string.h> #include<alg

【转】毛虫算法&mdash;&mdash;尺取法

转自http://www.myexception.cn/program/1839999.html 妹子满分~~~~ 毛毛虫算法--尺取法 有这么一类问题,需要在给的一组数据中找到不大于某一个上限的"最优连续子序列" 于是就有了这样一种方法,找这个子序列的过程很像毛毛虫爬行方式,我管它叫毛毛虫算法,比较流行的叫法是"尺取法". 喏,就像图里的妹纸一样~ 还是举个栗子: Poj3061 给长度为n的数组和一个整数m,求总和不小于m的连续子序列的最小长度 输入 n = 1

51nod1127(尺取法)

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1127 题意:中文题诶- 思路:尺取法 维护一个队列,若当前队首的元素在后面出现了,那么我们就将其删除,若当前队列里含有26个字母,我们就记录其size. 取所有size里面的最小值就是我们要的答案... 代码: 1 #include <iostream> 2 #include <stdio.h> 3 #include <string>