我是靠谱客的博主 英勇乌冬面,最近开发中收集的这篇文章主要介绍HDU 5672 String【尺取法】,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=5672

题意:

有一个10长度1,000,000的字符串,仅由小写字母构成。求有多少个子串,包含有至少k(1k26)个不同的字母?

分析:

很典型的尺取法。
不断依次移动区间的头尾,使区间满足条件,并找到这样的区间个数。
注意说的是包含至少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【尺取法】所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部