1159D - The minimal unique substring

    xiaoxiao2022-07-07  183

    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 < = l < = a ​ 1<=l<=a​ 1<=l<=a

    ​ 那么存在 l ′ = ( l + a + 1 ) , l ′ ∈ [ a + 2 , 2 ∗ a + 1 ] l'=(l+a+1),l'\in[a+2,2*a+1] l=(l+a+1),l[a+2,2a+1] 可行的,因为所有 l ′ l' l满足 l ′ + k < = n l'+k<=n l+k<=n (即 l ′ l' 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; }
    最新回复(0)