KMP的特殊性质之CF526D
题目传送门
这道题就纯属水紫好吧,顶多是个绿……
话不多说,进入正题。
这道题我们可以利用 KMP 的性质来做,我们直接上推算过程:
首先我们可以把
接着,我们进行求
开始扫后面的值,当扫到第二个
以此类推,后面每次扫到的都是上一个
我们可以通过最后一个点和它的
但是!
我们举个例子:
9 2
ababababa
我们的段数是大于
我们可以先把它原本多少段先求出来,然后看看究竟是
有些坑点和详细细节写代码里的:
#include<bits/stdc++.h>
using namespace std;
int n,m,p,h,i=0,j=-1,nxt[1000010]={-1};
char c[1000010];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>c[i];
while(i<n){ //求next不用说了
if(j==-1||c[i+1]==c[j+1]){
i++,j++;
nxt[i]=j;
}else j=nxt[j];
}
for(int i=1;i<=n;i++){
p=i-nxt[i]; //C的长度
h=i/p; //C的个数
if(i%p)cout<<((h/m-h%m)>0); //如果不为空,大于就行了
else cout<<((h/m-h%m)>=0); //当A为空的时候,个数除以k(代码里是m)是要大于等于才行的
}
return 0;
}
更正信息
- 感谢 @岂非 的提醒,已经更正,今后题解将更加注意。
- 上次修改未改正完全,现已彻底修改