import java.util.Scanner;
public class KMP {
public int [] FindNext(String s)
{
int []next=new int[s.length()];
int m=s.length();
int j=1;
int sum=0;
while(j<m)
{
int result=0;
for(int i=0;i<=j-1;i++)
{
boolean find=true;
for(int k=0;k<=i;k++)
{
if(s.charAt(k)!=s.charAt(j-i+k))
{
find=false;
}
}
if(find) sum=i+1;
if((sum>result)&&find)result=sum;
}
next[j]=result;
j++;
}
for(int i=s.length()-1;i>0;i--)next[i]=next[i-1];
next[0]=-1;
return next;
}
public static void main(String [] args)
{
Scanner input=new Scanner(System.in);
String s=input.next();
System.out.println();
KMP kmp=new KMP();
int [] next=kmp.FindNext(s);
for(int i=0;i<s.length();i++)System.out.print(next[i]+" ");
}
就是非常普通地从j-1个,1开始比较前缀和后缀
出来了数组之后再整体右移一位然后将第一位变为-1