Advertisement
Guest User

Untitled

a guest
Oct 28th, 2016
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.20 KB | None | 0 0
  1. llindromic tree
  2. const int MAXN = 105000;
  3. struct node
  4. {
  5. int next[26];
  6. int len;
  7. int sufflink;
  8. int num;
  9. };
  10. int len;
  11. char s[MAXN];
  12. node tree[MAXN];
  13. int num; // node 1 - root with len -1, node 2 - root with len 0
  14. int suff; // max suffix palindrome
  15. long long ans;
  16. bool addLetter(int pos)
  17. {
  18. for( int i = 0 ; i < 50 ; i++ ) cout << "- " ;
  19. cout << endl ;
  20. int cur = suff, curlen = 0;
  21. int let = s[pos] - 'a';
  22. cout << "after curr = suff : cur = "<< cur << endl ;
  23. cout << "let = " << let << endl ;
  24. while (true)
  25. {
  26. curlen = tree[cur].len;
  27. cout << "in first while loop : cur = " << cur << " & curlen " << curlen << " & pos = " << pos << endl ;
  28. if (pos - 1 - curlen >= 0 && s[pos - 1 - curlen] == s[pos])
  29. break;
  30. cur = tree[cur].sufflink;
  31. }
  32. if (tree[cur].next[let])
  33. {
  34. cout << "here if(tree[cur].next[let]) = " << tree[cur].next[let] << endl ;
  35. suff = tree[cur].next[let];
  36. return false;
  37. }
  38. num++;
  39. suff = num;
  40. tree[num].len = tree[cur].len + 2;
  41. tree[cur].next[let] = num;
  42. cout << " num++ then, num = " << num << endl ;
  43. if (tree[num].len == 1)
  44. {
  45. tree[num].sufflink = 2;
  46. tree[num].num = 1;
  47. return true;
  48. }
  49. while (true)
  50. {
  51. cur = tree[cur].sufflink;
  52. curlen = tree[cur].len;
  53. cout << "in 2nd while loop : cur = " << cur << " & curlen " << curlen << " & pos = " << pos << endl ;
  54. if (pos - 1 - curlen >= 0 && s[pos - 1 - curlen] == s[pos])
  55. {
  56. tree[num].sufflink = tree[cur].next[let];
  57. break;
  58. }
  59. }
  60. tree[num].num = 1 + tree[tree[num].sufflink].num;
  61. return true;
  62. }
  63. void initTree()
  64. {
  65. num = 2;
  66. suff = 2;
  67. tree[1].len = -1;
  68. tree[1].sufflink = 1;
  69. tree[2].len = 0;
  70. tree[2].sufflink = 1;
  71. }
  72. int main()
  73. {
  74. gets(s);
  75. len = strlen(s);
  76. initTree();
  77. for (int i = 0; i < len; i++)
  78. {
  79. addLetter(i);
  80. ans += tree[suff].num;
  81. cout << "\n\n" << ans << "\n\n" ;
  82. }
  83. cout << endl ;
  84. for( int i = 0 ; i < 50 ; i++ ) cout << " -" ;
  85. cout << endl;
  86. cout << ans << endl;
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement