Advertisement
Kambarych

Counting Subpalindromes

Jan 21st, 2023
211
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.17 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define For(i, n)           for(int i = 0; i < n; ++i)
  6. #define all(x)              (x).begin(),(x).end()
  7. #define rall(x)             (x).rbegin(),(x).rend()
  8.  
  9. #define ld                  long double
  10. #define pii                 pair<int, int>
  11. #define vt                  vector
  12. #define ll                  long long
  13. #define endl                '\n'
  14.  
  15. const int MAX = 1e9;
  16. const int MOD = 1e9 + 7;
  17. const ll  INF = 1e18;
  18. const ld  PI  = 3.14159265358979323846;
  19.  
  20. template<typename T>
  21. void read(vt<T> & a) {
  22.     For(i, a.size()) cin >> a[i];
  23. }
  24. template<typename T>
  25. void print(vt<T> & a) {
  26.     For(i, a.size()) cout << a[i] << " ";
  27.     cout << endl;
  28. }
  29. template<typename T>
  30. void print2(vt<vt<T> > & a) {
  31.     For(i, a.size()) {
  32.         For(j, a[i].size()) cout << a[i][j] << " ";
  33.         cout << endl;
  34.     }
  35. }
  36. template<typename T>
  37. void read2(vt<vt<T> > & a) {
  38.     For(i, a.size()) For(j, a[i].size()) cin >> a[i][j];
  39. }
  40.  
  41. void solve()
  42. {
  43.     string s; cin >> s;
  44.     int n = s.size();
  45.     vt<ll> hash(n + 1);
  46.     vt<ll> power(n + 1, 1);
  47.     For(i, n) {
  48.         hash[i + 1] = hash[i] + power[i] * (s[i] - 'a' + 1);
  49.         power[i + 1] = power[i] * 31;
  50.     }
  51.     vt<ll> rhash(n + 1);
  52.     reverse(all(s));
  53.     For(i, n) {
  54.         rhash[i + 1] = rhash[i] + power[i] * (s[i] - 'a' + 1);
  55.     }
  56.  
  57.     ll ans = 0;
  58.     For(i, n) {
  59.         int l = 0, r = min(n - i - 1, i), m;
  60.         while (l < r) {
  61.             m = (l + r + 1) >> 1;
  62.             int lb1 = i - m;
  63.             int rb1 = i;
  64.             int lb2 = n - (i + m) - 1;
  65.             int rb2 = n - i - 1;
  66.  
  67.             int offset1 = lb1;
  68.             int offset2 = lb2;
  69.             ll h1 = hash[rb1 + 1] - hash[lb1];
  70.             ll h2 = rhash[rb2 + 1] - rhash[lb2];
  71.             if (offset1 > offset2) {
  72.                 h2 *= power[offset1 - offset2];
  73.             } else {
  74.                 h1 *= power[offset2 - offset1];
  75.             }
  76.             if (h1 == h2) {
  77.                 l = m;
  78.             } else {
  79.                 r = m - 1;
  80.             }
  81.         }
  82.         ans += l + 1;
  83.     }
  84.     For(i, n) {
  85.         int l = -1, r = min(n - i - 2, i), m;
  86.         while (l < r) {
  87.             m = (l + r + 1) >> 1;
  88.             int lb1 = i - m;
  89.             int rb1 = i;
  90.             int lb2 = n - (i + m) - 1 - 1;
  91.             int rb2 = n - i - 1 - 1;
  92.  
  93.             int offset1 = lb1;
  94.             int offset2 = lb2;
  95.             ll h1 = hash[rb1 + 1] - hash[lb1];
  96.             ll h2 = rhash[rb2 + 1] - rhash[lb2];
  97.             if (offset1 > offset2) {
  98.                 h2 *= power[offset1 - offset2];
  99.             } else {
  100.                 h1 *= power[offset2 - offset1];
  101.             }
  102.  
  103.             if (h1 == h2) {
  104.                 l = m;
  105.             } else {
  106.                 r = m - 1;
  107.             }
  108.         }
  109.         ans += l + 1;
  110.     }
  111.     cout << ans << endl;
  112. }
  113.  
  114. int main()
  115. {
  116.     ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  117. // #define FILE
  118. #ifdef FILE
  119.     freopen("output.txt", "w", stdout);
  120.     freopen("input.txt", "r", stdin);
  121. #endif
  122.     cout << setprecision(20) << fixed;
  123.     int T = 1;
  124.     For(t, T) {
  125.         solve();
  126.     }
  127.     return 0;
  128. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement