Advertisement
Guest User

Untitled

a guest
Jan 27th, 2020
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.28 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. using ll = long long;
  6. using ull = unsigned long long;
  7.  
  8. const unsigned K = 31;
  9. const ull P = (1ull << K) - 1;
  10.  
  11. inline ull mod(ll x){
  12.     if(x < P)
  13.         return x;
  14.     x = (x >> K) + (x & P);
  15.     x = (x >> K) + (x & P);
  16.     return x == P ? 0 : x;
  17. }
  18.  
  19. struct H{
  20.     unsigned h[4000001], p[4000001];
  21.     H(int size, char* s){
  22.         p[0] = 1;
  23.         for(size_t i = 0; i < size; i++){
  24.             p[i + 1] = mod((ll)p[i] * K);
  25.             h[i + 1] = mod((ll)h[i] * K + s[i] - 'a' + 1);
  26.         }
  27.     }
  28.     inline ull get(int id, int len){
  29.         return mod(h[id + len - 1] - (ll)h[id - 1] * p[len]);
  30.     }
  31. };
  32.  
  33. int n;
  34. char s[4000001];
  35. H* h;
  36. H* rh;
  37.  
  38. inline bool equal(int len, int beg){
  39.     return h->get(1, len) == rh->get(n - beg + 1, len);
  40. }
  41.  
  42. int binSearch(int x){
  43.     int begin = 0, end = x + 1, middle;
  44.     while(end - begin > 1){
  45.         middle = (begin + end) / 2;
  46.         if(equal(middle, x))
  47.             begin = middle;
  48.         else
  49.             end = middle;
  50.     }
  51.     return begin;
  52. }
  53.  
  54. int main(){
  55.     scanf("%d", &n);
  56.     do{
  57.         s[0] = getchar_unlocked();
  58.     }while(s[0] < 'a' or s[0] > 'z');
  59.     for(int i = 1; i < n; i++)
  60.         s[i] = getchar_unlocked();
  61.     h = new H(n, s);
  62.     for(int i = 0; i < n / 2; i++)
  63.         swap(s[i], s[n - i - 1]);
  64.     rh = new H(n, s);
  65.     for(int i = 1; i <= n; i++)
  66.         printf("%d ", binSearch(i));
  67.     printf("\n");
  68. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement