import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner cin = new Scanner(System.in); while (cin.hasNext()) { testGetNext(cin); } } public static void testGetNext(Scanner cin) { String s = cin.nextLine(); int next[] = new int[s.length()]; getNext(s,next); // System.out.println(Arrays.toString(next)); for( int i=0;i< s.length();i++) { System.out.print( (next[i] +1) +" " ); } System.out.println(); } public static int kmp(String s, String t) { int next[] = new int[t.length()]; getNext(t, next); int n = kmpMatch(s,t,next); System.out.println(n); return n; } private static int kmpMatch(String s, String t, int[] next) { int j=0; int len = t.length(); for(int i=0;i<s.length();i++) { if(s.charAt(i) == t.charAt(j) ) { if(j == len -1) return (i-len+2); j++; } else { while(next[j] != -1) { if(s.charAt(i) == t.charAt(next[j])) { j= next[j] +1; break; } else j= next[j]; } } } return 0; } private static void getNext(String t, int next[]) { next[0] = -1; for (int i = 1; i < t.length(); i++) { int k = next[i - 1]; if ( k!= -1 && t.charAt(k) == t.charAt(i-1)) next[i] = k + 1; else { next[i] =0; while( k!= -1 &&next[k]!= -1 ) { k=next[k]; if(t.charAt(k) == t.charAt(i-1)) { next[i] = k+1; } } } } } } /************************************************************** Problem: 2151 User: admin Language: Java Result: Accepted Time:817 ms Memory:41296 kb ****************************************************************/