Advertisement
yeskendir_sultanov

Поиск всех палиндромов

Mar 3rd, 2025
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.88 KB | Source Code | 0 0
  1. #include <bits/stdc++.h>
  2. #define ull unsigned long long
  3.  
  4. using namespace std;
  5.  
  6. const int N = 2e5 + 3;
  7. const ull base = 29;
  8.  
  9. ull h[2][N], b[N];
  10. string s;
  11. int n;
  12.  
  13. ull get(int i, int j, int k) {
  14.     if (k == 0) {
  15.         if (i == 0) {
  16.             return h[k][j];
  17.         }
  18.         return (h[k][j] - h[k][i - 1] * b[j - i + 1]);
  19.     } else {
  20.         if (j + 1 == n) {
  21.             return h[k][i];
  22.         }
  23.         return (h[k][i] - h[k][j + 1] * b[j - i + 1]);
  24.     }
  25. }
  26.  
  27. int main() {
  28.     ios_base::sync_with_stdio(NULL);
  29.     cin.tie(0); cout.tie(0);
  30.     cin >> s;
  31.     n = s.size();
  32.     b[0] = 1;
  33.     for (int i = 1; i <= n; ++i) {
  34.         b[i] = b[i - 1] * base;
  35.     }
  36.    
  37.     h[0][0] = s[0];
  38.     for (int i = 1; i < n; ++i) {
  39.         h[0][i] = (h[0][i - 1] * base + s[i]);
  40.     }
  41.    
  42.     h[1][n - 1] = s[n - 1];
  43.     for (int i = n - 2; i >= 0; --i) {
  44.         h[1][i] = (h[1][i + 1] * base + s[i]);    
  45.     }
  46.    
  47.     long long res = 0;
  48.    
  49.     for (int i = 0; i < n; ++i) {
  50.         int low = 1, high = min(i, n - 1 - i), ans = 0;
  51.         while (low <= high) {
  52.             int mid = (low + high) / 2;
  53.             if (get(i - mid, i, 0) == get(i, i + mid, 1)) {
  54.                 ans = mid;
  55.                 low = mid + 1;
  56.             } else {
  57.                 high = mid - 1;
  58.             }
  59.         }
  60.        
  61.         res += ans + 1;
  62.        
  63.         if (!(i + 1 < n && s[i] == s[i + 1])) {
  64.             continue;  
  65.         }
  66.        
  67.         low = 1, high = min(i, n - 2 - i), ans = 0;
  68.         while (low <= high) {
  69.             int mid = (low + high) / 2;
  70.             if (get(i - mid, i, 0) == get(i + 1, i + 1 + mid, 1)) {
  71.                 ans = mid;
  72.                 low = mid + 1;
  73.             } else {
  74.                 high = mid - 1;
  75.             }
  76.         }
  77.        
  78.         res += ans + 1;
  79.     }
  80.    
  81.     cout << res;
  82.    
  83.     return 0;
  84. }
  85.  
  86.  
  87.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement