Thursday, March 21, 2019

[Codeforces] D. Palindrome pairs

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : D. Palindrome pairs
Source            : Codeforces
Category          : Data Structure
Algorithm         : Palindromic Tree
Verdict           : Accepted

  1. #include "bits/stdc++.h"  
  2.   
  3. using namespace std;  
  4.   
  5. static const int maxn = 1e5 + 5;  
  6.   
  7. struct Node  
  8. {  
  9.       int next[27], len, sufflink, num;  
  10.       Node(int len = 0, int sufflink = 0, int num = 0)  
  11.             : len(len)  
  12.             , sufflink(sufflink)  
  13.             , num(num)  
  14.             {  
  15.                   memset(next, 0, sizeof next);  
  16.             }  
  17. };  
  18.   
  19. Node Tree[maxn];  
  20. int num, suff;  
  21. string s;  
  22.   
  23. void init()  
  24. {  
  25.       for (int i = 0; i < maxn; i++) Tree[i] = Node();  
  26.       num = 2; suff = 2;  
  27.       Tree[1].len = -1; Tree[1].sufflink = 1;  
  28.       Tree[2].len = 0; Tree[2].sufflink = 1;  
  29. }  
  30.   
  31. bool addLetter(string &s, int pos)  
  32. {  
  33.       int cur = suff, curlen = 0;  
  34.       int let = s[pos] - 'a';  
  35.       while (true)  
  36.       {  
  37.             curlen = Tree[cur].len;  
  38.             if (pos-1-curlen >= 0 && s[pos-1-curlen] == s[pos]) break;  
  39.             cur = Tree[cur].sufflink;  
  40.       }  
  41.       if (Tree[cur].next[let])  
  42.       {  
  43.             suff = Tree[cur].next[let];  
  44.             return false;  
  45.       }  
  46.       ++num;  
  47.       suff = num;  
  48.       Tree[num].len = Tree[cur].len + 2;  
  49.       Tree[cur].next[let] = num;  
  50.       if (Tree[num].len == 1)  
  51.       {  
  52.             Tree[num].sufflink = 2;  
  53.             Tree[num].num = 1;  
  54.             return true;  
  55.       }  
  56.       while (true)  
  57.       {  
  58.             cur = Tree[cur].sufflink;  
  59.             curlen = Tree[cur].len;  
  60.             if (pos-1-curlen >= 0 && s[pos-1-curlen] == s[pos])  
  61.             {  
  62.                   Tree[num].sufflink = Tree[cur].next[let];  
  63.                   break;  
  64.             }  
  65.       }  
  66.       Tree[num].num = 1 + Tree[ Tree[num].sufflink ].num;  
  67.       return true;  
  68. }  
  69.   
  70. int prefix[maxn], suffix[maxn];  
  71.   
  72. int main()  
  73. {  
  74.       ios_base::sync_with_stdio(false);  
  75.       cin.tie(nullptr);  
  76.       cout << fixed << setprecision(15);  
  77.       #ifndef ONLINE_JUDGE  
  78.             freopen("in.txt""r", stdin);  
  79.       #endif // ONLINE_JUDGE  
  80.   
  81.       cin >> s;  
  82.       int len = s.size();  
  83.       init();  
  84.       for (int i = 0; i < len; i++)  
  85.       {  
  86.             addLetter(s, i);  
  87.             prefix[i] = Tree[suff].num;  
  88.       }  
  89.       reverse(s.begin(), s.end());  
  90.       init();  
  91.       for (int i = 0; i < len; i++)  
  92.       {  
  93.             addLetter(s, i);  
  94.             suffix[len-1-i] = Tree[suff].num;  
  95.       }  
  96.       long long sum_suffix = 0;  
  97.       for (int i = 0; i < len; i++) sum_suffix += suffix[i];  
  98.       long long ans = 0;  
  99.       for (int i = 0; i < len; i++)  
  100.       {  
  101.             sum_suffix -= suffix[i];  
  102.             ans += (prefix[i] * sum_suffix);  
  103.       }  
  104.       cout << ans;  
  105. }  

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.