题解 CF526D 【Om Nom and Necklace】
提供一种简便做法。
首先我们考虑将原串写成
我们考虑
我们定义
如果是
如果另一种形式同理,判断大于等于
const int N=1e6+5;
int n,k;
int nxt[N],ans[N];
char s[N];
int main()
{
fio();
gi(n,k);
scanf("%s",s+1);
for(int i=2,j=0;i<=n;++i)
{
while(j&&s[i]!=s[j+1]) j=nxt[j];
if(s[i]==s[j+1]) ++j;
nxt[i]=j;
}
for(int i=1;i<=n;++i)
{
int cur=i-nxt[i],d=i/cur;
if(i%cur) ans[i]=((d/k-d%k)>0);
else ans[i]=((d/k-d%k)>=0);
}
for(int i=1;i<=n;++i) print(ans[i]);
end();
}