Friday, May 24, 2019

[Spoj] LPS - Longest Palindromic Substring

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : LPS - Longest Palindromic Substring
Source            : Spoj
Category          : String
Algorithm         : Manacher Algorithm
Verdict           : Accepted

  1. #include <bits/stdc++.h>  
  2.   
  3. using namespace std;  
  4.   
  5. int manacher(const string &s)  
  6. {  
  7.       int n = s.size();  
  8.       vector < vector <int> > p(2, vector <int> (n, 0));  
  9.   
  10.       for (int z = 0, l = 0, r = 0; z < 2; z++, l = 0, r = 0)  
  11.       {  
  12.             for (int i = 0; i < n; i++)  
  13.             {  
  14.                   if (i < r) p[z][i] = min(r - i + !z, p[z][l + r - i + !z]);  
  15.                   int L = i - p[z][i];  
  16.                   int R = i + p[z][i] - !z;  
  17.                   while (L - 1 >= 0 && R + 1 < n && s[L - 1] == s[R + 1]) p[z][i]++, L--, R++;  
  18.                   if (R > r) l = L, r = R;  
  19.             }  
  20.       }  
  21.       int maxi = *max_element(p[0].begin(), p[0].end()) * 2;  
  22.       maxi = max(maxi, *max_element(p[1].begin(), p[1].end()) * 2 + 1);  
  23.       return maxi;  
  24. }  
  25.   
  26.   
  27. signed main()  
  28. {  
  29.       ios_base::sync_with_stdio(false);  
  30.       cin.tie(nullptr);  
  31.       cout.tie(nullptr);  
  32.       cout << fixed << setprecision(3);  
  33.   
  34.       #ifndef ONLINE_JUDGE  
  35.             freopen("in.txt""r", stdin);  
  36.       #endif // ONLINE_JUDGE  
  37.   
  38.       int len;  
  39.       string s;  
  40.       cin >> len >> s;  
  41.       cout << manacher(s) << '\n';  
  42.   
  43. }  

No comments:

Post a Comment

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