hdu 5056 Boring count
2014-09-29 13:33
405 查看
贪心算法。需要计算分别以每个字母结尾的且每个字母出现的次数不超过k的字符串,我们设定一个初始位置s,然后用游标i从头到尾遍历字符串,使用map记录期间各个字母出现的次数,如果以s开头i结尾的字符串满足要求,则把结果增加i-s+1。否则的话向前移动s,不断维护map,直到s指向的字母与i相同,从而满足字符串条件,把结果增加i-s+1。
需要注意的是结果可能会超int,需要用long long。
代码如下:
需要注意的是结果可能会超int,需要用long long。
代码如下:
#define MAXS 100002 #include <cstdlib> #include <iostream> #include <cstdio> #include <cstring> #include <map> #include <vector> #include <limits> using namespace std; string s; int n; void solve() { map <char, int> mv; long long ans = 0; int start = 0; for( int i = 0 ; i < s.size() ; i++ ) { if( mv.count(s[i]) == 0 ) { mv[s[i]] = 1; ans += i - start + 1; } else if( mv[s[i]] < n ) { mv[s[i]]++; ans += i -start + 1; } else { while( s[start] != s[i] ) { mv[s[start]]--; start++; } start++; ans += i - start + 1; } } cout<<ans<<endl; } int main(int argc, char *argv[]) { int T; scanf("%d", &T); while( T-- ) { cin>>s; scanf("%d", &n); solve(); } return 0; }
相关文章推荐
- HDU 5056 Boring count
- HDU 5056 Boring count(数学)
- HDU 5056 Boring count(不超过k个字符的子串个数)
- HDU 5056 Boring count(滑动窗口)
- HDU 5056 Boring count(BestCoder Round #11 (Div. 2))
- 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 --统计
- BestCoder11(Div2) 1003 Boring count (hdu 5056) 解题报告
- HDU-5056-Boring count-周赛4补题
- HDU 5056 Boring count(不超过k个字符的子串个数)
- HDU 5056 Boring count(数学)
- HDU 5056 Boring count 字符串处统计+滑动窗口法
- hdu 5056 Boring count ( 窗口转移法)
- HDU 5056 Boring count(窗口滑动法)
- hdu 5056 Boring count (窗体滑动)