String
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 939 Accepted Submission(s): 305
Problem Description
There is a string
S
.
S
only contain lower case English character.
(10≤length(S)≤1,000,000)
How many substrings there are that contain at least k(1≤k≤26) distinct characters?
How many substrings there are that contain at least k(1≤k≤26) distinct characters?
Input
There are multiple test cases. The first line of input contains an integer
T(1≤T≤10)
indicating the number of test cases. For each test case:
The first line contains string S .
The second line contains a integer k(1≤k≤26) .
The first line contains string S .
The second line contains a integer k(1≤k≤26) .
Output
For each test case, output the number of substrings that contain at least
k
dictinct characters.
Sample Input
2 abcabcabca 4 abcabcabcabc 3
Sample Output
0 55
Source
一开始想当然尔的把题目看为k个不同的。。。结果gg
#include <bits/stdc++.h>
using namespace std;
#define ll long long
char s[1000006];
int vis[30];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int i,j,len,k,res;
memset(vis,0,sizeof(vis));
scanf("%s%d",s,&k);
i=j=res=0;
len=strlen(s);
ll ans=0;
while(j!=len||res>=k)
{
if(res>=k)
{
ans+=len-j+1;
if(vis[s[i]-'a']>1)
vis[s[i]-'a']--;
else
{
vis[s[i]-'a']=0;
res--;
}
i++;
}
else if(j<len)
{
vis[s[j]-'a']++;
if(vis[s[j]-'a']==1)
res++;
j++;
}
}
printf("%lld\n",ans);
}
return 0;
}
- - 一开始用map 感觉方便一点 结果超时n发 一怒之下自己模拟了。。。