zoukankan      html  css  js  c++  java
  • hdu 5672 String 尺取法

    String

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)


    Problem Description
    There is a string S.S only contain lower case English character.(10length(S)1,000,000)
    How many substrings there are that contain at least k(1k26) distinct characters?
     
    Input
    There are multiple test cases. The first line of input contains an integer T(1T10) indicating the number of test cases. For each test case:

    The first line contains string S.
    The second line contains a integer k(1k26).
     
    Output
    For each test case, output the number of substrings that contain at least k dictinct characters.
     
    Sample Input
    2 abcabcabca 4 abcabcabcabc 3
     
    Sample Output
    0 55
     
    Source
    思路:就是从左端点找到最近的那个符合条件的右端点;这题特容易超时
    尺取法:http://wenku.baidu.com/link?url=_jFXiTHG4ZN60Ki0U5Svb26oKLbbUMtJAwrSnkDC1W1e9RqFK_DaolSUE3MyCKmrv2oGEKWn_GN5P7IQuV0Qp5jxA1SApZHSBYI4NqEYq_u
    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<string>
    #include<queue>
    #include<algorithm>
    #include<stack>
    #include<cstring>
    #include<vector>
    #include<list>
    #include<set>
    #include<map>
    #define true ture
    #define false flase
    using namespace std;
    #define ll __int64
    #define inf 0xfffffff
    int scan()
    {
        int res = 0 , ch ;
        while( !( ( ch = getchar() ) >= '0' && ch <= '9' ) )
        {
            if( ch == EOF )  return 1 << 30 ;
        }
        res = ch - '0' ;
        while( ( ch = getchar() ) >= '0' && ch <= '9' )
            res = res * 10 + ( ch - '0' ) ;
        return res ;
    }
    int flag[30];
    char a[1000010];
    int main()
    {
        int x,y,z,i,t;
        scanf("%d",&x);
        while(x--)
        {
            memset(flag,0,sizeof(flag));
            scanf("%s",a);
            scanf("%d",&y);
            int st=0,en=0,ji=0;
            ll ans=0;
            int len=strlen(a);
            while(1)
            {
                while(en<len&&ji<y)
                {
                    if(flag[a[en]-'a']==0)
                    ji++;
                    flag[a[en]-'a']++;
                    en++;
                }
                if(ji<y)break;
                ans+=(len-en+1);
                flag[a[st]-'a']--;
                if(flag[a[st]-'a']==0)
                ji--;
                st++;
            }
            printf("%I64d
    ",ans);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    webpack的入门实践,看这篇就够了
    vue系列教程-15vuex的使用
    vue系列教程-14axios的使用
    vue系列教程-13vuecli初体验
    vue系列教程-12vue单文件组件开发
    vue系列教程-11vuerouter路由
    vue系列教程-10vue过滤器和自定义指令
    vue系列教程-09vue组件
    Spring Redis开启事务支持错误用法导致服务不可用
    MySQL主从数据库配置与原理
  • 原文地址:https://www.cnblogs.com/jhz033/p/5444053.html
Copyright © 2011-2022 走看看