标签:pop har gre lin nic des esc iostream 字母
3 abc 1 abcabc 1 abcabc 2
6 15 21
官方题解:
枚举字符串下标i,每次计算以i为结尾的符合条件的最长串。那么以i为结尾的符合条件子串个数就是最长串的长度。
求和就可以。
计算以i为结尾的符合条件的最长串两种方法:
1.维护一个起点下标startPos,初始为1。
假设当前为i,那么cnt[str[i]]++,假设大于k的话,就while( str[startPos] != str[i+1] ) cnt[str[startPos]]--, startPos++; 每次都保证 startPos~i区间每一个字母个数都不超过k个。ans += ( i-startPos+1 )。
时间复杂度O(n)
2.预处理出全部字母的前缀和。然后通过二分找出以i为结尾的符合条件的最长串的左边界。
时间复杂度O(nlogn),写的不够好的可能超时。
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int a[30]; char s[101000]; int main() { int t,k,n; scanf("%d",&t); while(t--) { memset(s,0,sizeof(s)); memset(a,0,sizeof(a)); scanf("%s",s); n=strlen(s); scanf("%d",&k); long long ans=0; int start=0; for(int i=0;i<n;i++) { int x=s[i]-'a'; a[x]++; if(a[x]>k) { while(s[start]!=s[i]) { a[s[start]-'a']--; start++; } a[s[start]-'a']--; start++; } ans+=(i-start+1); } printf("%I64d\n",ans); } return 0; }
hdu Boring count(BestCode round #11)
标签:pop har gre lin nic des esc iostream 字母
原文地址:http://www.cnblogs.com/gccbuaa/p/7363113.html