描述
题解
这个题思路好巧妙啊,我想了好久都没有想通,找了一个前辈的题解才搞懂……看了好大一会儿~~~
贴一下该大牛的题解:
来源:_TCgogogo_’s blog 感谢大神详细的题解!!!
代码
#include <cstdio>
#include <cstring>
int const MAXN = 1e6 + 5;
int n, k;
char s[MAXN];
char ans[MAXN];
int nt[MAXN];
void get_nt()
{
nt[0] = -1;
for (int i = 1, j = -1; i < n; i++)
{
while (j != -1 && s[j + 1] != s[i])
{
j = nt[j];
}
if (s[j + 1] == s[i])
{
j++;
}
nt[i] = j;
}
}
int main()
{
scanf("%d%d%s", &n, &k, s);
get_nt();
for(int i = 0; i < n; i++)
{
int len = i - nt[i];
int num = (i + 1) / len;
int t = num % k;
if (t == 0)
{
ans[i] = '1';
}
else
{
if (len * num != i + 1)
{
t++;
}
if (num / k >= t)
{
ans[i] = '1';
}
else
{
ans[i] = '0';
}
}
}
printf("%s\n", ans);
return 0;
}