2 abcabcabca 4 abcabcabcabc 3
0 55
大意:
在一个字符串中任意取子串,求其至少有K个不同字母的子串个数。
#include<iostream> #include<cstring> #include<stdio.h> using namespace std; char str[1001000]; int num[26],k; int main() { //freopen("in.txt","r",stdin); int T; cin>>T; while(T--) { long long ans=0; memset(num,0,sizeof(num)); cin>>(str+1)>>k; int cur=0,r=0,l=1,len=strlen(str+1); while(l<=len) { while(r<len&&cur<k) { r++; if(num[str[r]-'a']==0) cur++; num[str[r]-'a']++; } if(cur==k) { ans+=len-r+1; num[str[l]-'a']--; if(num[str[l++]-'a']==0) cur--; while(num[str[l-1]-'a']) { ans+=len-r+1; num[str[l]-'a']--; if(num[str[l++]-'a']==0) cur--; } } else break; } cout<<ans<<endl; } }
切记,代码越简明越好。