zoukankan      html  css  js  c++  java
  • 2020牛客暑期多校训练营(第六场)K题K-Bag(思维)

    2020牛客暑期多校训练营(第六场)K题K-Bag(思维)

    K-Bag

    题意:求一个字符串是不是任意个1到k的排列的组合的子串,即首尾不需要1到k全都有,中间任意端都要有。

    题解:很明显任意两个相同的数字不在一个排列中,我们可以利用这一特点求出每个位置第一个不合法的位置(不能在一个排列)在哪,然后枚举第一段的以何位置截止,求之后中间端长度是否刚好为k既可,如果能走到最后,说明为part-K-Bag。

    #include<iostream>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int t,n,k,a[500007],b[500007],ma[500007],to[500007],len;
     
    int check(int p){
        int now=p;
        while(now<=n){
            if(to[now]-now==k){
                now=to[now];
            }
            else return 0;
        }
        return 1;
    }
    void init(){
        memset(ma,0,sizeof(ma));
        memset(to,0,sizeof(to));
        memset(b,0,sizeof(b));
    }
    int main(){
        scanf("%d",&t);
        while(t--){
            init();
            scanf("%d%d",&n,&k);
            int m=0,ok=1;
            for(int i=1;i<=n;i++){
                scanf("%d",&a[i]);
                if(a[i]>k||a[i]<=0){
                    ok=0;
                }
                b[++m]=a[i];
            }
            if(ok==0){
                printf("NO
    ");
                continue;
            }
            sort(b+1,b+1+m);
            m=unique(b+1,b+1+m)-b-1;
            for(int i=1;i<=n;++i){
                a[i]=lower_bound(b+1,b+1+m,a[i])-b;
            }
            int len=n+1;
            for(int i=n;i>=1;i--){
                if(ma[a[i]]==0){
                    to[i]=i+k;
                }
                else{
                    to[i]=ma[a[i]];
                }
                len=min(len,to[i]);
                ma[a[i]]=i;
            }
            for(int i=n-1;i>=1;i--){
                to[i]=min(to[i],to[i+1]);
            }
            ok=0;
            for(int i=1;i<len;i++){
                if(check(i+1)==1){
                    ok=1;
                }
            }
            if(ok)printf("YES
    ");
            else{
                printf("NO
    ");
            }
        }
    }
    
    
  • 相关阅读:
    Android之动态图片
    Java之简单图形面积计算
    Java之姐妹素数
    Java之经典Student问题2
    数据库事务四大特性
    TCP/IP分层
    海量数据问题处理办法
    36个常见java面试题
    【19】【滑动窗口】【栽跟头】最长不重复子字符串
    一些面试题
  • 原文地址:https://www.cnblogs.com/whitelily/p/13399586.html
Copyright © 2011-2022 走看看