本来以为很简单,不想补这道题了
耐心看下来发现就算知道尺取法也做不出来
这道题的题解的精髓之处在于ans += i - j + 1,我们维护的字串的是从a[j] - a[i]的,每次ans加的都是以a[i]为末尾,长度为t(t >=1&& t <= len)的,这样用o(n)的时间遍历了所有子串,真的是值得学习,毕竟以前没见过也想不出来
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<cmath>
#define ll long long
#define mod 1000000007
#define inf 0x3f3f3f3f
using namespace std;
int cnt[30];
char a[100005];
int k;
bool ok()
{
for(int i = 1; i <= 26; i ++)
if(cnt[i] > k) return 0;
return 1;
}
int main()
{
int t;
scanf("%d", &t);
while(t --)
{
memset(cnt, 0, sizeof(cnt));
scanf("%s%d", a + 1, &k);
ll ans = 0;
int len = strlen(a + 1);
for(int i = 1, j = 1; i <= len; i ++)
{
cnt[(int)(a[i] - 'a') + 1] ++;
while(! ok())
{
cnt[(int)(a[j] - 'a') + 1] --;
j ++;
}
ans += (i - j + 1);
}
printf("%I64d\n", ans);
}
return 0;
}