一.题目链接:
HDU-5056
二.题目大意:
给一个字符串 s,在一段子串中,若每个字母出现的个数不大于 k,则 ans++;
三.分析:
先明确一个基本概念:若 s 的某段子串满足条件,则这段子串的每一段子串都满足.
滑动窗口:设置一个左端,一个右端.
当满足条件时,尽可能地让右端最大.
否则左端向右移动,到满足条件为止.
四.代码实现:
#include <set>
#include <map>
#include <ctime>
#include <queue>
#include <cmath>
#include <stack>
#include <vector>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define eps 1e-4
#define PI acos(-1.0)
#define ll long long int
using namespace std;
map <char, int> mp;
bool check(int k)
{
for(char i = 'a'; i <= 'z'; ++i)
{
if(mp[i] > k)
return 1;
}
return 0;
}
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
mp.clear();
string s;
cin >> s;
int len = s.size();
int k;
scanf("%d", &k);
ll ans = 0;
for(int r = 0, l = 0; r < len; ++r)
{
mp[s[r]]++;
while(check(k))
{
mp[s[l]]--;
l++;
}
ans += r - l + 1;
}
printf("%lld\n", ans);
}
return 0;
}