String HDU - 5672
原题链接
考察:双指针
应该算水题,但我WA了多发....
思路:
不能右端点计数,要左端点计数,这样就不需要考虑左右两边计重.
Code
#include <iostream>
#include <cstring>
using namespace std;
typedef long long LL;
const int N = 1000010,M = 30;
char s[N];
int k,cnt[M];
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
scanf("%s%d", s + 1, &k);
int len = strlen(s + 1),sz = 0;
LL ans = 0;
for (int i = 1, j = 1; i <= len; i++)
{
while(j<=len&&sz<k)
{
if(!cnt[s[j]-'a']) sz++;
cnt[s[j] - 'a']++;
j++;
}
if(sz==k)
ans+=(LL)len-j+2;
cnt[s[i]-'a']--;
if(!cnt[s[i]-'a']) sz--;
}
printf("%lld\n", ans);
}
return 0;
}