有一天,欧姆诺姆发现了一串长度为n的宝石串,上面有五颜六色的宝石。他决定摘取前面若干个宝石来做成一个漂亮的项链。
他对漂亮的项链是这样定义的,现在有一条项链S,当S=A+B+A+B+A+...+A+B+A的时候是漂亮的,这儿A,B是一些宝石串,“+”表示连接操作。S中有k+1个A和k个B组成。A和B可能是空串。
现在给出宝石串,问怎么切前几个才能得到一个漂亮的宝石项链。他切下来之后不会改变宝石的顺序。
样例解释:
在这个样例中前6个可以组成漂亮的串( A="", B="bca")。前7个也可以(A="b", B="ca")。
Input
单组测试数据。 第一行有两个整数n, k (1≤n,k≤1 000 000),表示宝石串原始的长度和在上文中提到的参数k。 第二行有n个由小写字母组成的串,表示原始宝石串。
Output
输出一行有n个01组成的字符串。第i(1≤i≤n)个位置是1的时候表示前i个宝石可以组成漂亮的宝石项链。
Input示例
样例输入1 7 2 bcabcab
Output示例
样例输出1
0000011
#include <stdio.h>
#include <iostream>
using namespace std;
const int N = 1e6 + 100;
int next[N], n, k;
char s[N];
void getnext()
{
int j = -1, i = 0;
next[0] = -1;
while (i < n)
{
if (j == -1 || s[i] == s[j])
{
next[++i] = ++j;
}
else
{
j = next[j];
}
}
}
int main()
{
scanf("%d%d", &n, &k);
scanf("%s", s);
getnext();
for(int i = 1; i <= n; i++)
{
int num = i / (i - next[i]);
if (i % (i - next[i]) == 0)
{
if (num / k >= num % k)
{
printf("1");
}
else
{
printf("0");
}
}
else
{
if (num / k > num % k)
{
printf("1");
}
else
{
printf("0");
}
}
}
puts("");
return 0;
}