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
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)
Input
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).
Output
k
Sample Input
2 abcabcabca 4 abcabcabcabc 3
Sample Output
0 55
Source
BestCoder Round #81 (div.2)
一开始想当然尔的把题目看为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发 一怒之下自己模拟了。。。