• eli和字符串 (牛客假期训练)


    链接:https://ac.nowcoder.com/acm/contest/3002/G
    来源:牛客网

    时间限制:C/C++ 2秒,其他语言4秒
    空间限制:C/C++ 262144K,其他语言524288K
    64bit IO Format: %lld

    题目描述

    eli拿到了一个仅由小写字母组成的字符串。
    她想截取一段连续子串,这个子串包含至少 个相同的某个字母
    她想知道,子串的长度最小值是多少?
    注:所谓连续子串,指字符串删除头部和尾部的部分字符(也可以不删除)剩下的字符串。例如:对于字符串“arcaea”而言,“arc”、“rcae”rcae”都是其子串。而car”、aa”则不是它的子串。
     

    输入描述:

    第一行输入两个正整数 

    输入仅有一行,为一个长度为
     的、仅由小写字母组成的字符串。
     

    输出描述:

    如果无论怎么取都无法满足条件,输出 

    否则输出一个正整数,为满足条件的子串长度最小值。
     
    示例1

    输入

    复制
    5 2
    abeba

    输出

    复制
    3

    说明选择“beb”mathit“beb”beb”子串,长度为3,其中包含相同的两个'b'

     解析:给题非常巧妙的用b[t][vis[t]]=i;来记录t字符的出现的次数(vis[t])和他的位置i。
    所以距离就变成了:ans=min(ans,i-b[t][vis[t]-k+1]+1);
    AC代码:
    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<map> 
    #include<bits/stdc++.h> 
    using namespace std;
    typedef long long ll; 
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    const int maxn=5e5+10;
    int n,k;
    char a[maxn];
    int b[100][maxn];
    int vis[maxn];
    int ans=0x3f3f3f3f;
    int main(){
        cin>>n>>k;
        scanf("%s",a+1);
        for(int i=1;i<=n;i++){
            int t=a[i]-'a';
            vis[t]++;
            b[t][vis[t]]=i;
            if(vis[t]>=k){
                ans=min(ans,i-b[t][vis[t]-k+1]+1);
            }
        }
        if(ans==0x3f3f3f3f){
            printf("-1
    ");
        }
        else{
            printf("%d",ans);
        }
    }
     
  • 相关阅读:
    java7或java8新特性
    反射中,Class.forName和ClassLoader区别
    &和&&的区别
    JAVA时区问题总结
    索引失效原因及解决索引失效方法
    索引失效的7种情况
    MySQL Explain详解
    java switch
    java 生成注释文档
    spring 获取配置文件的值
  • 原文地址:https://www.cnblogs.com/lipu123/p/12266514.html
Copyright © 2020-2023  润新知