题目大意:给你一个数字串A,找出数字串的所以前缀B(不包括本身),求B的前缀和后缀完全匹配的最大个数所形成的数字串C,特别的因为前后缀也不包括本身,所以当只有一个数字时最大匹配为 -1 !
题目例子: eg: A :1 2 3 4 5 所以 B: 1 1 2 1 2 3 1 2 3 4 所以四个B的前后缀的最大匹配为 -1 0 0 0 即最后的答案为 -1 0 0 0 (题目描述还有个最小字典序,因为第一个必须为-1 后面的最下也为0 所以求出来的就是最小字典序,这是题目设的坑!)
题目思路:题目描述还是有点绕口,其实就是求A的所有前缀的前缀和后缀的最大匹配,不难发现这就是KMP的next数组,所以本题就是求数字串A的next数组,当然要去掉next数组的最后一个和第二个,当然还要特判只有一个数字的情况!
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=200;
int str[maxn];
int ans[maxn];
int Next[maxn];
void getnext(int len)
{
int Max=0;
int i=-1,j=0;
Next[0]=-1;
while(j<len)
{
if(i==-1||str[i]==str[j])
{
++i,++j;
Next[j]=i;
}
else
i=Next[i];
if(j>=2)ans[j-1]=Next[j];
}
ans[j-1]=Next[j-1];
return ;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++)
scanf("%d",&str[i]);
int len=n;
ans[0]=-1;
getnext(len);
for(int i=0;i<n-2;i++)
printf("%d ",ans[i]);
printf("%d\n",ans[n-2]);
}
return 0;
}