zoukankan      html  css  js  c++  java
  • 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("%I64d
    ", ans);
        }
    }
    
  • 相关阅读:
    [状压DP]JZOJ 3293 阶乘字符串
    [线段树][Splay][树状数组]JZOJ 3292 发牌
    MySQL之索引
    MySQL(二)
    mysql 练习题
    前端 jQuery
    关于vertical-align和line-height的真知灼见
    CSS语法
    HTML初识
    HTTP协议
  • 原文地址:https://www.cnblogs.com/Tuesdayzz/p/5758655.html
Copyright © 2011-2022 走看看