1159D - The minimal unique substring

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值