比较难以理解的地方已经在代码里指出,可以多想一下
借鉴了大佬的这篇博客
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <queue>
#include <stack>
#include <map>
typedef long long ll;
using namespace std;
int n,k;
int next[1000100];
char ans[1000100];
void kmp_pre(string s,int m)
{
int i=0;
int j=next[0]=-1;
while(i<m)
{
while(j!=-1&&s[i]!=s[j]) j=next[j];
next[++i]=++j;
}
}
int main()
{
memset(ans,'0',sizeof(ans));
scanf("%d%d",&n,&k);
getchar();
string s;
cin>>s;
kmp_pre(s,s.size());
for(int i=1;i<=n;i++)
{
int num=i/(i-next[i]);//计算循环节个数
if(i%(i-next[i])==0)//该串形如SSSSSSSSS(ABCABCABCABC)
{
if(num/k>=num%k)//num/k是AB所包含的S的个数,num%k是A所包含的S的个数
ans[i-1]='1';
}
else//该串形如SSSSSSSST(ABCABCABCABCAB)
{
if(num/k>num%k)//num/k是AB所包含的S的个数,num%k是T所包含的S的个数
ans[i-1]='1';
}
}
ans[n]=0;
cout<<ans;
return 0;
}