Dang_Quan_10_Tin

Palindrome Tree

Jun 5th, 2021
999
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.23 KB | None | 0 0
  1.  
  2. struct node
  3. {
  4.     int len;
  5.     node *child[26], *sufflink;
  6.     node()
  7.     {
  8.         len = 0;
  9.         for (int i = 0; i < 26; ++i)
  10.             child[i] = NULL;
  11.         sufflink = NULL;
  12.     }
  13. };
  14.  
  15. struct PalindromeTree
  16. {
  17.     node odd, even;
  18.     PalindromeTree()
  19.     {
  20.         odd.len = -1;
  21.         odd.sufflink = &odd;
  22.         even.len = 0;
  23.         even.sufflink = &odd;
  24.     }
  25.  
  26.     void Assign(string &s)
  27.     {
  28.         node *last = &even;
  29.         for (int i = 0; i < (int)s.size(); ++i)
  30.         {
  31.             node *tmp = last;
  32.  
  33.             while (s[i - tmp->len - 1] != s[i])
  34.                 tmp = tmp->sufflink;
  35.  
  36.             if (tmp->child[s[i] - 'a'])
  37.             {
  38.                 last = tmp->child[s[i] - 'a'];
  39.                 continue;
  40.             }
  41.  
  42.             tmp->child[s[i] - 'a'] = new node;
  43.             last = tmp->child[s[i] - 'a'];
  44.             last->len = tmp->len + 2;
  45.  
  46.             if (last->len == 1)
  47.             {
  48.                 last->sufflink = &even;
  49.                 continue;
  50.             }
  51.  
  52.             tmp = tmp->sufflink;
  53.  
  54.             while (s[i - tmp->len - 1] != s[i])
  55.                 tmp = tmp->sufflink;
  56.  
  57.             last->sufflink = tmp->child[s[i] - 'a'];
  58.         }
  59.     }
  60. };
Advertisement
Add Comment
Please, Sign In to add comment