Advertisement
TAImatem

Аврора Интенсив Респ день1

Jan 9th, 2023
1,100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.08 KB | None | 0 0
  1. int lmax = 0, pcnt = 0;
  2.  
  3. void Manaker(string s)
  4. {
  5.     pcnt = 0, lmax = 0;
  6.     int n = s.size();
  7.     vector<int> d1(n), d2(n);
  8.     int l = -1, r = -1;
  9.     for (int i = 0; i < n; i++)
  10.     {
  11.         int k = (i > r ? 1 : min(d1[l + r - i], r - i + 1));
  12.         while (i - k >= 0 && i + k < n && s[i - k] == s[i + k]) k++;
  13.         d1[i] = k;
  14.         if (i + k - 1 > r)
  15.         {
  16.             l = i - k + 1;
  17.             r = i + k - 1;
  18.         }
  19.     }
  20.     //l1=d1[i]+d1[i]-1
  21.     d2[0] = 0;
  22.     l = -1; r = -1;
  23.     for (int i = 1; i < n; i++)
  24.     {
  25.         int k = (i > r ? 0 : min(d2[l + r - i + 1], r - i + 1));
  26.         while (i + k < n && i - k - 1 >= 0 && s[i + k] == s[i - k - 1]) k++;
  27.         d2[i] = k;
  28.         if (i + k - 1 > r)
  29.         {
  30.             l = i - k;
  31.             r = i + k - 1;
  32.         }
  33.     }
  34.     //l2=d2[i]*2
  35.     for (int i = 0; i < n; i++)
  36.     {
  37.         lmax = max(max(d1[i] * 2 - 1, d2[i] * 2), lmax);
  38.         pcnt += d1[i] + d2[i];
  39.     }
  40. }
  41.  
  42. vector<int> getHashV(vector<vector<int>>& hash, int i, int l)
  43. {
  44.     vector<int> v;
  45.     int cst = 0;
  46.     while (l)
  47.     {
  48.         if (l & 1)
  49.         {
  50.             v.push_back(hash[cst][i]);
  51.             i += (1 << cst);
  52.         }
  53.         cst++;
  54.         l >>= 1;
  55.     }
  56.     return v;
  57. }
  58.  
  59. void SuffArr(string s)
  60. {
  61.     pcnt = 0;
  62.     lmax = 0;
  63.     int n = s.size();
  64.     string s2 = s;
  65.     reverse(s2.begin(), s2.end());
  66.     s = s + "#" + s2;
  67.     long long mult = max((size_t)256, s.size());
  68.     int st = 0;
  69.     while ((1 << st) < s.size()) st++;
  70.     s.resize(1 << st, '#');
  71.     vector<vector<int>> hash(st + 1);
  72.     hash[0].resize(s.size());
  73.     for (int i = 0; i < s.size(); i++)
  74.         hash[0][i] = s[i];
  75.     for (int k = 1; k <= st; k++)
  76.     {
  77.         vector<pair<long long, int>> prehash(s.size() - (1 << k) + 1);
  78.         for (int i = 0; i < prehash.size(); i++)
  79.         {
  80.             prehash[i] = { mult * hash[k - 1][i] + hash[k - 1][i + (1 << (k - 1))], i };
  81.         }
  82.         hash[k].resize(prehash.size());
  83.         sort(prehash.begin(), prehash.end());
  84.         int num = -1;
  85.         long long lhash = -1;
  86.         for (auto& a : prehash)
  87.         {
  88.             if (a.first != lhash)
  89.                 num++;
  90.             hash[k][a.second] = num;
  91.             lhash = a.first;
  92.         }
  93.     }
  94.     vector<int> d1(n), d2(n);
  95.     for (int i = 0; i < n; i++)
  96.     {
  97.         int l = 0, r = i;
  98.         while (r > l)
  99.         {
  100.             int m = (l + r + 1) / 2;
  101.             int i1 = i - m;
  102.             int i2 = n + (n - i) - m;
  103.             vector<int> v1 = getHashV(hash, i1, m), v2 = getHashV(hash, i2, m);
  104.             if (equal(v1.begin(), v1.end(), v2.begin(), v2.end()))
  105.                 l = m;
  106.             else
  107.                 r = m - 1;
  108.         }
  109.         d1[i] = r + 1;
  110.  
  111.         if (i == 0)
  112.         {
  113.             d2[i] = 0;
  114.             continue;
  115.         }
  116.         l = 0, r = i;
  117.         while (r > l)
  118.         {
  119.             int m = (l + r + 1) / 2;
  120.             int i1 = i - m;
  121.             int i2 = n + (n - i) + 1 - m;
  122.             vector<int> v1 = getHashV(hash, i1, m), v2 = getHashV(hash, i2, m);
  123.             if (equal(v1.begin(), v1.end(), v2.begin(), v2.end()))
  124.                 l = m;
  125.             else
  126.                 r = m - 1;
  127.         }
  128.         d2[i] = r;
  129.         }
  130.     for (int i = 0; i < n; i++)
  131.     {
  132.         lmax = max(max(d1[i] * 2 - 1, d2[i] * 2), lmax);
  133.         pcnt += d1[i] + d2[i];
  134.     }
  135. }
  136.  
  137. int main() {
  138. #ifdef DEBUG
  139.     freopen("input.txt", "r", stdin);
  140.     //freopen("output.txt", "w", stdout);
  141. #endif
  142.     string s;
  143.     cin >> s;
  144.     Manaker(s);
  145.     cout << "palindrome count: " << pcnt << "; longest palindrome length: " << lmax << endl;
  146.     SuffArr(s);
  147.     cout << "palindrome count: " << pcnt << "; longest palindrome length: " << lmax << endl;
  148.     return 0;
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement