Friday, May 24, 2019

[CS Academy] Palindromic Friendship

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : Palindromic Friendship
Source            : CS Academy
Category          : String
Algorithm         : Manacher Algorithm
Verdict           : Accepted


  1. #include <bits/stdc++.h>  
  2.   
  3. using namespace std;  
  4.   
  5. static const int maxn = 3e5 + 5;  
  6.   
  7. vector <int> relation[maxn];  
  8.   
  9. bool can(int x, int y)  
  10. {  
  11.       return find(relation[x].begin(), relation[x].end(), y) != relation[x].end();  
  12. }  
  13.   
  14. int manacher(vector <int> &s)  
  15. {  
  16.       int n = s.size();  
  17.       vector < vector <int> > p(2, vector <int> (n, 0));  
  18.   
  19.       for (int z = 0, l = 0, r = 0; z < 2; z++, l = 0, r = 0)  
  20.       {  
  21.             for (int i = 0; i < n; i++)  
  22.             {  
  23.                   if (i < r) p[z][i] = min(r - i + !z, p[z][l + r - i + !z]);  
  24.                   int L = i - p[z][i];  
  25.                   int R = i + p[z][i] - !z;  
  26.                   while (L - 1 >= 0 && R + 1 < n && can(s[L - 1], s[R + 1])) p[z][i]++, L--, R++;  
  27.                   if (R > r) l = L, r = R;  
  28.             }  
  29.       }  
  30.       int maxi = *max_element(p[0].begin(), p[0].end()) * 2;  
  31.       maxi = max(maxi, *max_element(p[1].begin(), p[1].end()) * 2 + 1);  
  32.       return maxi;  
  33. }  
  34.   
  35. signed main()  
  36. {  
  37.       ios_base::sync_with_stdio(false);  
  38.       cin.tie(nullptr);  
  39.       cout.tie(nullptr);  
  40.       cout << fixed << setprecision(3);  
  41.   
  42.       #ifndef ONLINE_JUDGE  
  43.             freopen("in.txt""r", stdin);  
  44.       #endif // ONLINE_JUDGE  
  45.   
  46.       int n, m;  
  47.       cin >> n >> m;  
  48.       for (int i = 1; i <= m; i++)  
  49.       {  
  50.             int x, y;  
  51.             cin >> x >> y;  
  52.             relation[x].push_back(y);  
  53.             relation[y].push_back(x);  
  54.       }  
  55.       vector <int> arr;  
  56.       for (int i = 1; i <= n; i++)  
  57.       {  
  58.             sort(relation[i].begin(), relation[i].end());  
  59.             arr.push_back(i);  
  60.       }  
  61.       cout << manacher(arr) << '\n';  
  62.   
  63. }  


No comments:

Post a Comment

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