Advertisement
newb_ie

String Hashing

Jan 7th, 2021
206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.60 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int maxN = 1e6 + 100;
  5. const int64_t mod = 1e9 + 7;
  6. const int64_t p = 31;
  7. int64_t inv[maxN],pref[maxN];
  8.  
  9. int64_t get_power (int64_t a,int64_t n) {
  10.     int64_t res = 1;
  11.     while (n) {
  12.         if (n & 1) res = (res * a) % mod;
  13.         n >>= 1;
  14.         a = (a * a) % mod;
  15.     }
  16.     return res;
  17. }
  18.  
  19. void init(string s) {
  20.     int64_t power = 1;
  21.     inv[0] = 1;
  22.     pref[0] = s[0] - 'a' + 1;
  23.     for (int i = 1; i < (int) s.size(); ++i) {
  24.         power *= p;
  25.         power %= mod;
  26.         inv[i] = get_power(power,mod - 2);
  27.         pref[i] = (pref[i - 1] + (s[i] - 'a' + 1) * power) % mod;
  28.     }
  29. }
  30.  
  31. int64_t Hash (int l,int r) {
  32.     int64_t res = pref[r];
  33.     if (l > 0) res = (res - pref[l - 1] + mod) % mod;
  34.     res = (res * inv[l]) % mod;
  35.     return res;
  36. }
  37.  
  38. int64_t single_Hash (string s) {
  39.     int64_t res = 0;
  40.     int64_t power = 1;
  41.     for (int i = 0; i < (int) s.size(); ++i) {
  42.         res = (res + (s[i] - 'a' + 1) * power) % mod;
  43.         power = (power * p) % mod;
  44.     }
  45.     return res;
  46. }
  47.  
  48. int main () {
  49.      ios::sync_with_stdio(false);
  50.      cin.tie(nullptr);
  51.      cout.tie(nullptr);
  52.      int T = 1;
  53.      //~ cin >> T;
  54.      //~ freopen ("input.txt", "r", stdin);
  55.      for (int test_case = 1; test_case <= T; ++test_case) {
  56.          int n;
  57.          while (cin >> n and EOF) {
  58.              string s,t;
  59.              cin >> t >> s;
  60.              init(s);
  61.              int64_t single = single_Hash(t);
  62.              bool no = true;
  63.              for (int i = n - 1; i < (int) s.size(); ++i) {
  64.                  if (single == Hash(i - n + 1,i)) {
  65.                      cout << i - n + 1 << "\n";
  66.                      no = false;
  67.                  }
  68.              }
  69.              if (no) cout << "\n";
  70.          }
  71.      }
  72.      //cerr << "Time elapsed :" << clock() * 1000.0 / CLOCKS_PER_SEC << " ms" << '\n';
  73. }
  74.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement