您的位置:首页 > 其它

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。

代码如下:

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: