Advertisement
MathQ_

Untitled

Jan 7th, 2021
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.46 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. typedef unsigned long long ull;
  5. typedef long long ll;
  6.  
  7. #define fast ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
  8.  
  9. using namespace std;
  10.  
  11. const ull mod = 1e9 + 289;
  12. const int p1 = 1000199, p2 = 1000289;
  13. vector<ull> deg1, deg2;
  14.  
  15. ull get_hash1(int l, int r, vector<ull> &h) {
  16.     return h[r] - h[l] * deg1[r - l];
  17. }
  18.  
  19. ull get_hash2(int l, int r, vector<ull> &h) {
  20.     return h[r] - h[l] * deg2[r - l] % mod;
  21. }
  22.  
  23. int main() {
  24.     fast
  25.  
  26.     int n, m;
  27.     cin >> n >> m;
  28.     vector<int> a(2 * n);
  29.     for (int i = 0; i < n; ++i) {
  30.         cin >> a[i];
  31.         a[2 * n - i - 1] = a[i];
  32.     }
  33.  
  34.     // считаем степени p
  35.     deg1.resize(2 * n + 1); deg2.resize(2 * n + 1);
  36.     deg1[0] = 1; deg2[0] = 1;
  37.     for (int i = 0; i < 2 * n; ++i) {
  38.         deg1[i + 1] = deg1[i] * p1;
  39.         deg2[i + 1] = (deg2[i] * p2) % mod;
  40.     }
  41.  
  42.     // считаем хеши
  43.     vector<ull> h1(2 * n + 1), h2(2 * n + 1);
  44.     h1[0] = 0; h2[0] = 0;
  45.     for (int i = 0; i < 2 * n; ++i) {
  46.         h1[i + 1] = h1[i] * p1 + a[i];
  47.         h2[i + 1] = (h2[i] * p2 % mod + a[i]) % mod;
  48.     }
  49.  
  50.     // сравниваем подстроки
  51.     for (int i = (n + 1) / 2; i < n; ++i) {
  52.         if (get_hash1(2 * i - n, i, h1) == get_hash1(n, 2 * n - i, h1) && get_hash2(2 * i - n, i, h2) == get_hash2(n, 2 * n - i, h2)) {
  53.             cout << i << " ";
  54.         }
  55.     }
  56.     cout << n << "\n";
  57.     return 0;
  58. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement