标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 932 Accepted Submission(s): 382
1.初始化左右端点
2.不断扩大右端点,直到满足条件
3.如果第二步中无法满足条件,则终止,否则更新结果
4.将左端点扩大1,然后回到第二步
尺取法的过程是上述,但是,对于这题,我们要做少许改动,因为尺取法的条件终止条件是无法满足条件,但是这题我们首先扩充右端点的话是一直到不满足条件(找到某个字母出
现次数大于K的那个串再break),所以这题我们的条件应该改成r在外层循环,找到无法满足条件的子串后再一直扩充左端点,直到满足条件。接下来怎么算子串个数呢?我也不知道
,discuss区里面这样说的。。
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <stdlib.h> #include <math.h> using namespace std; typedef long long LL; const int N = 100005; int Hash[N],k; char str[N]; bool judge(){ for(int i=0;i<26;i++){ if(Hash[i]>k) return false; } return true; } int main() { int tcase; scanf("%d",&tcase); while(tcase--){ scanf("%s",str); scanf("%d",&k); int len = strlen(str); memset(Hash,0,sizeof(Hash)); int l=0,r=0; LL cnt=0; while(r<len){ Hash[str[r]-‘a‘]++; while(l<len&&!judge()){ Hash[str[l]-‘a‘]--; l++; } if(!judge()) break; //printf("%d %d\n",l,r); cnt =cnt+(r-l+1); r++; } printf("%lld\n",cnt); } return 0; }
标签:
原文地址:http://www.cnblogs.com/liyinggang/p/5652215.html