Advertisement
Guest User

Untitled

a guest
Apr 3rd, 2020
223
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.36 KB | None | 0 0
  1. import java.util.Arrays;
  2. import java.util.Scanner;
  3.  
  4. public class ManachersAlgorythm {
  5.  
  6.     public static String findLongestPalindrome(String s) {
  7.         if (s==null || s.length()==0)
  8.             return "";
  9.  
  10.         char[] s2 = addBoundaries(s.toCharArray());
  11.         int[] p = new int[s2.length];
  12.         int c = 0, r = 0; // Here the first element in s2 has been processed.
  13.         int m = 0, n = 0; // The walking indices to compare if two elements are the same
  14.         for (int i = 1; i<s2.length; i++) {
  15.             if (i>r) {
  16.                 p[i] = 0; m = i-1; n = i+1;
  17.             } else {
  18.                 int i2 = c*2-i;
  19.                 if (p[i2]<(r-i)) {
  20.                     p[i] = p[i2];
  21.                     m = -1; // This signals bypassing the while loop below.
  22.                 } else {
  23.                     p[i] = r-i;
  24.                     n = r+1; m = i*2-n;
  25.                 }
  26.             }
  27.             while (m>=0 && n<s2.length && s2[m]==s2[n]) {
  28.                 p[i]++; m--; n++;
  29.             }
  30.             if ((i+p[i])>r) {
  31.                 c = i; r = i+p[i];
  32.             }
  33.         }
  34.         int len = 0; c = 0;
  35.         for (int i = 1; i<s2.length; i++) {
  36.             if (len<p[i]) {
  37.                 len = p[i]; c = i;
  38.             }
  39.         }
  40.         char[] ss = Arrays.copyOfRange(s2, c-len, c+len+1);
  41.         return String.valueOf(removeBoundaries(ss));
  42.     }
  43.  
  44.     private static char[] addBoundaries(char[] cs) {
  45.         if (cs==null || cs.length==0)
  46.             return "||".toCharArray();
  47.  
  48.         char[] cs2 = new char[cs.length*2+1];
  49.         for (int i = 0; i<(cs2.length-1); i = i+2) {
  50.             cs2[i] = '|';
  51.             cs2[i+1] = cs[i/2];
  52.         }
  53.         cs2[cs2.length-1] = '|';
  54.         return cs2;
  55.     }
  56.  
  57.     private static char[] removeBoundaries(char[] cs) {
  58.         if (cs==null || cs.length<3)
  59.             return "".toCharArray();
  60.  
  61.         char[] cs2 = new char[(cs.length-1)/2];
  62.         for (int i = 0; i<cs2.length; i++) {
  63.             cs2[i] = cs[i*2+1];
  64.         }
  65.         return cs2;
  66.     }
  67.  
  68.     public static void main(String[] args) {
  69.  
  70.         Scanner in = new Scanner(System.in);
  71.         String string = in.next();
  72.         String result = ManachersAlgorythm.findLongestPalindrome(string);
  73.         System.out.println(result.length());
  74.         System.out.println(result);
  75.         in.close();
  76.     }
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement