【BestCoder】 HDOJ 5056 Boring count
2014-09-28 21:27
281 查看
枚举字符串下标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 <queue> #include <stack> #include <map> #include <set> #include <bitset> #include <cstdio> #include <algorithm> #include <cstring> #include <climits> #include <cstdlib> #include <cmath> #include <time.h> #define maxn 100005 #define maxm 40005 #define eps 1e-10 #define mod 10000007 #define INF 1e9 #define lowbit(x) (x&(-x)) #define mp make_pair #define ls o<<1 #define rs o<<1 | 1 #define lson o<<1, L, mid #define rson o<<1 | 1, mid+1, R typedef long long LL; typedef unsigned long long ULL; //typedef int LL; using namespace std; LL qpow(LL a, LL b){LL res=1,base=a;while(b){if(b%2)res=res*base;base=base*base;b/=2;}return res;} LL powmod(LL a, LL b){LL res=1,base=a;while(b){if(b%2)res=res*base%mod;base=base*base%mod;b/=2;}return res;} void scanf(int &__x){__x=0;char __ch=getchar();while(__ch==' '||__ch=='\n')__ch=getchar();while(__ch>='0'&&__ch<='9')__x=__x*10+__ch-'0',__ch = getchar();} LL gcd(LL _a, LL _b){if(!_b) return _a;else return gcd(_b, _a%_b);} //head int c[100]; char s[maxn]; int k; void init(void) { memset(c, 0, sizeof c); } void read(void) { scanf("%s", s); scanf("%d", &k); } void work(void) { int len = strlen(s), r = 0, f = 0; LL ans = 0; int t, tt; for(int i = 0; i < len; i++) { t = s[i] - 'a'; c[t]++, f++; while(c[t] > k) { tt = s[r++] - 'a'; c[tt]--; } ans += f - r; } printf("%I64d\n", ans); } int main(void) { int _; while(scanf("%d", &_)!=EOF) { while(_--) { init(); read(); work(); } } return 0; }
[/code]
相关文章推荐
- 【HDOJ 5056】 Boring count (排列组合)
- 【BestCoder】 HDOJ 5055 Bob and math problem
- 【BestCoder】 HDOJ 5067 Harry And Dig Machine
- 【BestCoder】 HDOJ 5171 GTY's birthday gift
- 【BestCoder】 HDOJ 5175 Misaki's Kiss again
- BestCoder Round 59 (HDOJ 5500) Reorder the Books
- 【BestCoder】 HDOJ 5054 Alice and Bob
- BestCoder11(Div2) 1003 Boring count (hdu 5056) 解题报告
- 【BestCoder】 HDOJ 5088
- 【BestCoder】 HDOJ 5109 Alexandra and A*B Problem
- HDU 5056 Boring Count --统计
- HDU 5056: Boring count 枚举子串?不要急,一个一个来!
- HDU 5056 Boring count 字符串处统计+滑动窗口法
- HDU 5056 Boring count(窗口滑动法或尺缩法)
- HDU 5056 - Boring count
- hdu 5056 Boring count
- HDU 5056 Boring count(数学)
- 【HDOJ】【BestCoder 2nd Anniversary】1003 Wool
- hdu 5056 Boring count (窗口滑动)
- HDOJ 4908 - BestCoder Sequence 简单统计