1159D - The minimal unique substring

链接:1159D - The minimal unique substring

思路:

a = ( n k ) / 2 a=(n-k)/2 a=(nk)/2 , 接下来我们构造字符串s,a个0,1个1,a个0,1个1…
(这道题还是暴力找规律靠谱点)
证明:

这样字符串的周期为 a + 1 a+1 a+1.

更确切的说字符串 s s s的组成是 ( a a a 0 0 0)( 1 1 1 1 1 1)( a a a 0 0 0)( 1 1 1 1 1 1) ( k 2 k-2 k2个字符) 四个部分

  • 如果 l > a + 1 l>a+1 l>a+1

​ 那么存在 l = l ( a + 1 ) l'=l-(a+1) l=l(a+1)也是可行的

  • 如果 1 &lt; = l &lt; = a 1&lt;=l&lt;=a​ 1<=l<=a

​ 那么存在 l = ( l + a + 1 ) , l [ a + 2 , 2 a + 1 ] l&#x27;=(l+a+1),l&#x27;\in[a+2,2*a+1] l=(l+a+1),l[a+2,2a+1] 可行的,因为所有 l l&#x27; l满足 l + k &lt; = n l&#x27;+k&lt;=n l+k<=n l l&#x27; l在第三部分

所以只有 l = a + 1 l=a+1​ l=a+1可能满足,下面我们来证明字符串 s s​ s 中以 l l​ l 为开始,长度为 k k​ k 的字符串只存在一个。

要想长度为k,那么 l l’ l只有可能在第1,2,3部分。但因为只有第二部分有 1 1 1 ,但是不能选( l l l 就是在第二部分)

故不存在 l ! = l l’ !=l l!=l 满足与字符串s相同

代码:

#include<bits/stdc++.h>
#define mset(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;

int main()
{
    int n,k;
    cin>>n>>k;
    int a=(n-k)/2;
    for(int i=1;i<=n;++i)
        cout<<(i%(a+1)==0?'1':'0');
    cout<<endl;
    return 0;
}