HDU-5672 String(尺取)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5672
题意:给出一个字符串和一个整数k,求含有k个不同字母的子字符串有多少个
思路:简单尺取即可,当前l~r满足要求后,那么len-r+1个都满足,注意删除l对应的字母即可
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #define ll long long using namespace std; char s[1000005]; int vis[30]; int main() { int t,k; while(~scanf("%d",&t)) { while(t--) { memset(vis,0,sizeof(vis)); scanf("%s %d",s,&k); int len=strlen(s); int l=0,r=0; int pos,num=0; ll ans=0; while(l<len) { while(r<len&&num<k) { pos=s[r]-'a'; if(!vis[pos]) { num++; } vis[pos]++; r++; } if(num<k) break; ans+=len-r+1; pos=s[l]-'a'; vis[pos]--; if(vis[pos]==0) num--; l++; } cout<<ans<<endl; } } }
PS:摸鱼怪的博客分享,欢迎感谢各路大牛的指点~