【构造,思维】cf1158B-The minimal unique substring

题意

给n,k,让你构造一个长度为n且 最小唯一子串 长度为k的01字符串。

唯一子串的意思是说,这个子串不能在这个串中找出第二个。如01010中的1010,就是一个唯一子串,010是最小唯一子串,因为里面长度为1的串,如0,1都存在多个,长度为2的串如01,10,也存在多个,但是你在这个串里找不到2个010,所以01010的最小唯一子串为101

题解

为了描述方便,我们使用m来表示m个0的集合,1就表示单独的1,如1m1m1就相当于100010001(如果m=3)这样的一个串。

考虑1m1m1m……1m1m的这样的串,设这个串的长度为n(m+1),不难发现最小唯一子串为(n-2)(m+1)+2

考虑1m1m1m……1m1m1的这样的串,设这个串的长度为n(m+1)+1,不难发现最小唯一子串为(n-2)(m+1)+2+1

考虑1m1m1m……1m1m1000的这样的串(假设m>3),设这个串的长度为n(m+1)+1+3,不难发现最小唯一子串为(n-2)(m+1)+2+1+3,

发现上面所有情况总的长度都比最小子串大2*m,我们考虑用这个性质来构造串

比如10 4

m=(10-4)/2=3;

构造出1 000 1000 10,0100为最小唯一子串,ok!

但是这个并不能ac所有情况,我们上述构造方法是基于总串比最小唯一子串大2*m的基础上才可行的。

例如 9 1

按照上述方法构造出 1 0000 1 000,不符题意

1 0000 100,我们发现他满足形式为1m1m100的情况,但是它的m为4,总长为8,最小唯一子串为01,长度为2

2+2*m=10>8,这是不可行的,

我们发现必须存在2个1m在大串才行,比如1 000 1000 10这样的情况。

什么时候不存在2个1m呢?m=(n-k)/2;

n/(1+m)>=2解得k>=2,所以我们特判一下k=1的情况就行了

代码

#include <bits/stdc++.h>using namespace std;
int n,k,m;
int main()
{
    cin>>n>>k;
    m=(n-k)/2;
    if(k==1)
    {
        for(int i=1; i<n; i++)cout<<0;
        cout<<1;
    }
    else
    {
        for(int i=0; i<n; i++)
        {
            if(i%(m+1)==0)cout<<1;
            else cout<<0;
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/wang_viscaria/article/details/92372190
今日推荐