hdu 5672 String (尺取法)

来源:互联网 发布:百度鹰眼定位软件 编辑:程序博客网 时间:2024/04/30 02:11

String

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1961    Accepted Submission(s): 636


Problem Description
There is a string S.S only contain lower case English character.(10length(S)1,000,000)
How many substrings there are that contain at least k(1k26) distinct characters?
 

Input
There are multiple test cases. The first line of input contains an integer T(1T10) indicating the number of test cases. For each test case:

The first line contains string S.
The second line contains a integer k(1k26).
 

Output
For each test case, output the number of substrings that contain at least k dictinct characters.
 

Sample Input
2abcabcabca4abcabcabcabc3
 

Sample Output
055
 

Source
BestCoder Round #81 (div.2)
 

Recommend
wange2014   |   We have carefully selected several similar problems for you:  6055 6054 6053 6052 6051 
#include<stdio.h>#include<algorithm>#include<string.h>using namespace std;char s[1000333];int c[30];int main(){    int T;    scanf("%d",&T);    while(T--)    {        scanf("%s",s);        memset(c,0,sizeof(c));        int len=strlen(s);        int l = 0,r = 0,k;        long long ans=0;        scanf("%d",&k);        int cnt=0;        while(l<=r&&l<len)        {            while(cnt<k&&r<len)            {                c[s[r]-'a']++;                if(c[s[r]-'a']==1)cnt++;                r++;            }            if(cnt==k)ans+=len-r+1;            if(c[s[l]-'a']==1)                cnt--;            c[s[l]-'a']--;            l++;        }        printf("%lld\n",ans);    }}


 
原创粉丝点击