Advertisement
Guest User

String Tale

a guest
Aug 30th, 2016
486
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.12 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. typedef long long ll;
  4. using namespace std;
  5.  
  6. #define f(i,a,b) for(int i = (a); i <= (b); i++)
  7. #define fd(i,a,b) for(int i = (a); i >= (b); i--)
  8. #define pb push_back
  9. #define SZ(x) ((int)x.size())
  10.  
  11. const ll MOD = 1000000007;
  12.  
  13. bool U[205];
  14. int N;
  15. ll E1[250005], E2[250005], LH1[250005], LH2[250005], RH1[250005], RH2[250005];
  16. string S, T;
  17. vector<int> P;
  18.  
  19. bool calcHashes(ll p1, ll p2)
  20. {
  21.     E1[1] = p1, E2[1] = p2;
  22.     f(i,2,N)
  23.     {
  24.         E1[i] = (E1[i-1]*p1) % MOD;
  25.         E2[i] = (E2[i-1]*p2) % MOD;
  26.         if(E1[i] == 0 || E2[i] == 0) return false;
  27.     }
  28.     LH1[0] = LH2[0] = S[0];
  29.     f(i,1,N-1)
  30.     {
  31.         LH1[i] = (LH1[i-1]*p1 + S[i]) % MOD;
  32.         if(LH1[i] == 0) return false;
  33.     }
  34.     f(i,1,N-1)
  35.     {
  36.         LH2[i] = (LH2[i-1]*p2 + S[i]) % MOD;
  37.         if(LH2[i] == 0) return false;
  38.     }
  39.     ll mult1 = 1, mult2 = 1;
  40.     RH1[N-1] = RH2[N-1] = S[N-1];
  41.     fd(i,N-2,0)
  42.     {
  43.         mult1 = (mult1*p1) % MOD;
  44.         mult2 = (mult2*p2) % MOD;
  45.         RH1[i] = (RH1[i+1] + S[i]*mult1) % MOD;
  46.         RH2[i] = (RH2[i+1] + S[i]*mult2) % MOD;
  47.         if(RH1[i] == 0 || RH2[i] == 0) return false;
  48.     }
  49.     return true;
  50. }
  51.  
  52. int main()
  53. {
  54.     f(i,2,200) if(!U[i])
  55.     {
  56.         if(i > 30) P.pb(i);
  57.         for(int k = i; k <= 200; k += i) U[k] = true;
  58.     }
  59.     cin >> N >> S >> T;
  60.     ll p1 = 31, p2 = 37;
  61.     while(true)
  62.     {
  63.         int idx1 = rand() % SZ(P);
  64.         int idx2 = rand() % SZ(P);
  65.         if(idx1 == idx2) continue;
  66.         if(calcHashes(P[idx1],P[idx2]))
  67.         {
  68.             p1 = P[idx1];
  69.             p2 = P[idx2];
  70.             break;
  71.         }
  72.     }
  73.     ll h1 = T[0];
  74.     ll h2 = T[0];
  75.     f(i,1,N-1) h1 = (h1*p1 + T[i]) % MOD;
  76.     f(i,1,N-1) h2 = (h2*p2 + T[i]) % MOD;
  77.     if(h1 == LH1[N-1] && h2 == LH2[N-1])
  78.     {
  79.         cout << 0;
  80.         return 0;
  81.     }
  82.     f(i,0,N-2)
  83.     {
  84.         ll hash1 = (RH1[i+1]*E1[i+1] + LH1[i]) % MOD;
  85.         ll hash2 = (RH2[i+1]*E2[i+1] + LH2[i]) % MOD;
  86.         if(hash1 == h1 && hash2 == h2)
  87.         {
  88.             cout << N-i-1;
  89.             return 0;
  90.         }
  91.     }
  92.     cout << -1;
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement