有一天,欧姆诺姆发现了一串长度为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个宝石可以组成漂亮的宝石项链。Sample Input
样例输入1 7 2 bcabcabSample Output
样例输出1 0000011
https://blog.csdn.net/m0_37134257/article/details/79831140
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<iostream>
#include<math.h>
#include<queue>
#include<map>
#include<vector>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
char s[1100000];
int nex[1100000];
int n,k;
void kk()
{
nex[0]=-1;
int k=-1;
int j=0;
while(j<n)
{
if(k==-1||s[k]==s[j])
{
j++;
k++;
nex[j]=k;
}
else k=nex[k];
}
}
int main()
{
scanf("%d%d",&n,&k);
scanf("%s",s);
kk();
for(int i=1;i<=n;i++)
{
int x=i/(i-nex[i]);
if(i%(i-nex[i]))
{
if(x/k>x%k)//每个AB串中含有 i / ( i - nex[i] ) / k 个s,最后会剩下 i / ( i - nex[i] ) % k 个s,
printf("1");
else printf("0");
}
else
{
if(x/k>=x%k) printf("1");
else printf("0");
}
}
printf("\n");
}