0
点赞
收藏
分享

微信扫一扫

hdu 5672


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发  一怒之下自己模拟了。。。

举报

相关推荐

0 条评论