Thursday, March 21, 2019

[URAL] 2060 - Subpalindrome pairs

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

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

No comments:

Post a Comment

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