题目链接:BestCoder Round #81 (div.2) 1003 String
题意
中文题,上有链接。就不贴了。
思路
枚举起点i,计算能够达到k个不同字母的最小下标j,则此时有子串len-j个。
将全部起点的值加起来即是结果。
代码
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
#define LL long long
const int MOD = 1000000007;
char str[1000009];
int num[27];
int get_cnt()
{
int cnt = 0;
for(int i=0; i<26; i++)
cnt += num[i]==0?0:1;
return cnt;
}
int main()
{
int T;
cin>>T;
while(T--)
{
int k;
memset(num, 0, sizeof(num));
scanf("%s%d", str, &k);
int len = strlen(str);
LL ans = 0;
int j = -1;
bool flag = false;
for(int i=0; i<len; i++)
{
while(get_cnt() < k)
{
j++;
if(j == len)
{
flag = true;
break;
}
num[str[j]-'a']++;
}
if(flag)
break;
ans += len-j;
num[str[i]-'a']--;
}
printf("%lld
", ans);
}
return 0;
}