概述
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5672
题意:
有一个10≤长度≤1,000,000的字符串,仅由小写字母构成。求有多少个子串,包含有至少k(1≤k≤26)个不同的字母?
分析:
很典型的尺取法。
不断依次移动区间的头尾,使区间满足条件,并找到这样的区间个数。
注意说的是包含至少k个,所以只要找到正好包含k个的区间,然后加上包含后面的串的个数就好了。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn = 1e6 + 5;
char s[maxn];
int c[26 + 5];
int main (void)
{
int T;scanf("%d", &T);
while(T--){
scanf("%s", s);
int k;scanf("%d", &k);
int len = strlen(s);
int l = 0, r = 0;
int cnt = 0;
long long ans = 0;
memset(c, 0, sizeof(c));
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("%I64dn", ans);
}
}
转载于:https://www.cnblogs.com/Tuesdayzz/p/5758655.html
最后
以上就是英勇乌冬面为你收集整理的HDU 5672 String【尺取法】的全部内容,希望文章能够帮你解决HDU 5672 String【尺取法】所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复