题意
给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;
}