Advertisement
Josif_tepe

Untitled

Dec 28th, 2023
1,155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.74 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4. typedef long long ll;
  5. const int alphabet_size = 26;
  6. const ll MOD = 1e9 + 7;
  7. void rolling_hash(string s, int window_size, string pattern) {
  8.     ll res_hash = 0;
  9.     for(int i = 0; i < (int) pattern.size(); i++) {
  10.         res_hash = (res_hash * alphabet_size + pattern[i]) % MOD;
  11.     }
  12.     int n = (int) s.size();
  13.     vector<ll> powers(n + 1, 1);
  14.     for(int i = 1; i <= n; i++) {
  15.         powers[i] = (powers[i - 1] * alphabet_size) % MOD;
  16.     }
  17.     ll hash = 0;
  18.     for(int i = 0; i < window_size; i++) {
  19.         hash = (hash * alphabet_size + s[i]) % MOD;
  20.     }
  21.     if(hash == res_hash) {
  22.         bool ok = true;
  23.         for(int i = 0; i < window_size; i++) {
  24.             if(pattern[i] != s[i]) {
  25.                 ok = false;
  26.                 break;
  27.             }
  28.         }
  29.         if(ok) {
  30.             cout << 0 << endl;
  31.         }
  32.     }
  33.     vector<ll> res(n - window_size + 1);
  34.     res[0] = hash;
  35.     for(int i = 1; i <= n - window_size; i++) {
  36.         hash = (hash - powers[window_size - 1] * s[i - 1]);
  37.         while (hash < 0) {
  38.             hash += MOD;
  39.         }
  40.         hash %= MOD;
  41.         hash = (hash * alphabet_size + s[i + window_size - 1]) % MOD;
  42.         if(hash == res_hash) {
  43.             bool ok =true;
  44.             for(int j = 0; j < window_size; j++) {
  45.                 if(pattern[j] != s[i + j]) {
  46.                     ok = false;
  47.                     break;
  48.                 }
  49.             }
  50.             if(ok) {
  51.                 cout << i << endl;
  52.             }
  53.         }
  54.         res[i] = hash;
  55.     }
  56.    
  57. }
  58. int main() {
  59.     ios_base::sync_with_stdio(false);
  60.     string text = "AABAACBAA";
  61.     string pattern = "BAA";
  62.     rolling_hash(text, 3, pattern);
  63.    return 0;
  64. }
  65.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement