Thursday, May 23, 2019

[Hackerearth] Last Forever

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : Last Forever
Source            : Hackerearth
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. int Bit[maxn], N;  
  8.   
  9. void update(int pos, int val)  
  10. {  
  11.       if (pos <= 0) return;  
  12.       while (pos <= N)  
  13.       {  
  14.             Bit[pos] += val;  
  15.             pos += (pos & -pos);  
  16.       }  
  17. }  
  18.   
  19. int query(int pos)  
  20. {  
  21.       if (pos > N) pos = N;  
  22.       int sum = 0;  
  23.       while (pos > 0)  
  24.       {  
  25.             sum += Bit[pos];  
  26.             pos -= (pos & -pos);  
  27.       }  
  28.       return sum;  
  29. }  
  30.   
  31. int range_query(int l, int r)  
  32. {  
  33.       return query(r) - query(l-1);  
  34. }  
  35.   
  36. struct Node  
  37. {  
  38.       int Next[30];  
  39.       int len;  
  40.       int sufflink;  
  41.       vector <int> prelink;  
  42.   
  43. };  
  44.   
  45. int len;  
  46. string s;  
  47. int num, suff;  
  48. Node Tree[maxn];  
  49.   
  50. bool addLetter(int pos)  
  51. {  
  52.       int cur = suff, curlen = 0;  
  53.       char let = s[pos] - 'a';  
  54.       while (true)  
  55.       {  
  56.             curlen = Tree[cur].len;  
  57.             if (pos - 1 - curlen >= 0 && s[pos - 1 - curlen] == s[pos]) break;  
  58.             cur = Tree[cur].sufflink;  
  59.       }  
  60.       if (Tree[cur].Next[let])  
  61.       {  
  62.             suff = Tree[cur].Next[let];  
  63.             return false;  
  64.       }  
  65.       num++;  
  66.       suff = num;  
  67.       Tree[num].len = Tree[cur].len + 2;  
  68.       Tree[cur].Next[let] = num;  
  69.       if (Tree[num].len == 1)  
  70.       {  
  71.             Tree[num].sufflink = 2;  
  72.             Tree[ Tree[num].sufflink ].prelink.push_back(num);  
  73.             return true;  
  74.       }  
  75.       while (true)  
  76.       {  
  77.             cur = Tree[cur].sufflink;  
  78.             curlen = Tree[cur].len;  
  79.             if (pos - 1 - curlen >= 0 && s[pos - 1 - curlen] == s[pos])  
  80.             {  
  81.                   Tree[num].sufflink = Tree[cur].Next[let];  
  82.                   Tree[ Tree[num].sufflink ].prelink.push_back(num);  
  83.                   break;  
  84.             }  
  85.       }  
  86.       return true;  
  87. }  
  88.   
  89. void init()  
  90. {  
  91.       num = 2; suff = 2;  
  92.       Tree[1].len = -1; Tree[1].sufflink = 1;  
  93.       Tree[2].len = 0; Tree[2].sufflink = 1;  
  94.       Tree[1].prelink.push_back(2);  
  95. }  
  96.   
  97. struct Query  
  98. {  
  99.       int len, id;  
  100.       Query(int len = 0, int id = 0) : len(len), id(id) {}  
  101. };  
  102.   
  103. vector <Query> queries[maxn];  
  104. vector <int> which[maxn];  
  105. int ans[maxn];  
  106.   
  107. void process(int u)  
  108. {  
  109.       for (int v : which[u])  
  110.       {  
  111.             for (Query q : queries[v])  
  112.             {  
  113.                   ans[q.id] = range_query(q.len, N) + (q.len == 0);  
  114.             }  
  115.       }  
  116. }  
  117.   
  118. void dfs(int u = 1)  
  119. {  
  120.       update(Tree[u].len, 1);  
  121.       process(u);  
  122.       for (int v : Tree[u].prelink) dfs(v);  
  123.       update(Tree[u].len, -1);  
  124. }  
  125.   
  126. signed main()  
  127. {  
  128.       ios_base::sync_with_stdio(false);  
  129.       cin.tie(nullptr);  
  130.       cout.tie(nullptr);  
  131.       cout << fixed << setprecision(3);  
  132.   
  133.       #ifndef ONLINE_JUDGE  
  134.             freopen("in.txt""r", stdin);  
  135.       #endif // ONLINE_JUDGE  
  136.   
  137.   
  138.       cin >> s;  
  139.       len = s.size();  
  140.       N = len;  
  141.       reverse(s.begin(), s.end());  
  142.       int q;  
  143.       cin >> q;  
  144.       for (int i = 1; i <= q; i++)  
  145.       {  
  146.             int id, lenn;  
  147.             cin >> id >> lenn;  
  148.             if (id >= len)  
  149.             {  
  150.                   ans[i] = 0 ;  
  151.                   continue;  
  152.             }  
  153.             id = len - id - 1;  
  154.             queries[id].emplace_back(lenn, i);  
  155.       }  
  156.       init();  
  157.       for (int i = 0; i < len; i++)  
  158.       {  
  159.             addLetter(i);  
  160.             which[suff].push_back(i);  
  161.       }  
  162.       dfs();  
  163.       for (int i = 1; i <= q; i++) cout << ans[i] << '\n';  
  164.       return 0;  
  165. }  

No comments:

Post a Comment

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