Advertisement
Guest User

Untitled

a guest
Apr 24th, 2015
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.46 KB | None | 0 0
  1. import java.util.*;
  2. import java.io.*;
  3.  
  4. public class A {
  5.     FastScanner in;
  6.     PrintWriter out;
  7.    
  8.     ArrayList<Node> nodes = new ArrayList<A.Node>();
  9.    
  10.     char[] s;
  11.    
  12.     class Node {
  13.         Node sufflink;
  14.         Node[] next;
  15.         int len;
  16.        
  17.         public Node(int len) {
  18.             this.len = len;
  19.             next = new Node[26];
  20.         }
  21.     }
  22.    
  23.     int countNodes = 0;
  24.    
  25.     class PalindromeTree {
  26.         Node rootOdd, rootEven;
  27.         Node suff;
  28.         char[] s;
  29.        
  30.         PalindromeTree(char[] s) {
  31.             this.s = s;
  32.             rootOdd = new Node(-1);
  33.             rootEven = new Node(0);
  34.             rootOdd.sufflink = rootEven.sufflink = rootOdd;
  35.             suff = rootEven;
  36.         }
  37.        
  38.         Node addChar(int pos) {
  39.             char c = s[pos];
  40.             Node cur = suff;
  41.            
  42.             while (true) {
  43.                 if (pos - cur.len - 1 >= 0 && s[pos - cur.len - 1] == c)
  44.                     break;
  45.                 cur = cur.sufflink;
  46.             }
  47.             if (cur.next[c - 'a'] != null) {
  48.                 suff = cur.next[c - 'a'];
  49.                 return suff;
  50.             }
  51.            
  52.             Node newNode = new Node(cur.len + 2);
  53.             nodes.add(newNode);
  54.             suff = cur.next[c - 'a'] = newNode;
  55.            
  56.             if (suff.len == 1) {
  57.                 suff.sufflink = rootEven;
  58.                 return suff;
  59.             }
  60.            
  61.             while (true) {
  62.                 cur = cur.sufflink;
  63.                 if (pos - cur.len - 1 >= 0 && s[pos - cur.len - 1] == c)
  64.                     break;
  65.             }
  66.             newNode.sufflink = cur.next[c - 'a'];
  67.             return suff;
  68.         }
  69.     }
  70.    
  71.     public void solve() throws IOException {
  72.         s = in.next().toCharArray();
  73.         PalindromeTree tree = new PalindromeTree(s);
  74.         for (int i = 0; i < s.length; i++) {
  75.             Node last = tree.addChar(i);
  76.         }
  77.     }
  78.  
  79.     public void run() {
  80.         try {
  81.             in = new FastScanner();
  82.             out = new PrintWriter(System.out);
  83.  
  84.             solve();
  85.  
  86.             out.close();
  87.         } catch (IOException e) {
  88.             e.printStackTrace();
  89.         }
  90.     }
  91.  
  92.     class FastScanner {
  93.         BufferedReader br;
  94.         StringTokenizer st;
  95.  
  96.         FastScanner() {
  97.             br = new BufferedReader(new InputStreamReader(System.in));
  98.         }
  99.  
  100.         FastScanner(File f) {
  101.             try {
  102.                 br = new BufferedReader(new FileReader(f));
  103.             } catch (FileNotFoundException e) {
  104.                 e.printStackTrace();
  105.             }
  106.         }
  107.  
  108.         String next() {
  109.             while (st == null || !st.hasMoreTokens()) {
  110.                 try {
  111.                     st = new StringTokenizer(br.readLine());
  112.                 } catch (IOException e) {
  113.                     e.printStackTrace();
  114.                 }
  115.             }
  116.             return st.nextToken();
  117.         }
  118.  
  119.         int nextInt() {
  120.             return Integer.parseInt(next());
  121.         }
  122.  
  123.         long nextLong() {
  124.             return Long.parseLong(next());
  125.         }
  126.  
  127.         double nextDouble() {
  128.             return Double.parseDouble(next());
  129.         }
  130.     }
  131.  
  132.     public static void main(String[] arg) {
  133.         new A().run();
  134.     }
  135. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement