Advertisement
MinhNGUYEN2k4

Hash || Foundstring

Sep 9th, 2020
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.39 KB | None | 0 0
  1. //Dai Ca Di Hoc
  2. #include <bits/stdc++.h>
  3. #define sz(x) int(x.size())
  4. #define reset(x) memset(x, 0,sizeof(x))
  5. #define MIN(x,y) if (x > (y)) x = (y)
  6. #define MAX(x,y) if (x < (y)) x = (y)
  7. #define PB push_back
  8. #define mp make_pair
  9. #define F first
  10. #define S second
  11. #define Task "foundstring"
  12. #define maxn 1000005
  13. #define MOD 1000000007
  14. #define remain(x) if (x > MOD) x -= MOD
  15. #define pii pair<int, int>
  16.  
  17. using namespace std;
  18.  
  19. string A, B;
  20. int n, m;
  21.  
  22. const int Base = 101;
  23. const long long MM = 1ll * MOD * MOD;
  24.  
  25. long long H[maxn], S[maxn];
  26.  
  27.  
  28. int main()
  29. {
  30.     ios_base::sync_with_stdio(0);
  31.     freopen(Task".inp", "r", stdin);
  32.     freopen(Task".out", "w", stdout);
  33.     cin >> B >> A;
  34.     m = A.length(); A = " " + A;
  35.     n = B.length(); B = " " + B;
  36.  
  37.     H[0] = 1;
  38.     for (int i = 1; i <= m; i++) H[i] = (H[i-1] * Base) % MOD;
  39.  
  40.     long long Sb = 0;
  41.     for (int i = 1; i <= n; i++) Sb = (Sb * Base + B[i]) % MOD;
  42.  
  43.     S[0] = 0;
  44.     for (int i = 1; i <= m; i++) S[i] = (S[i-1] * Base + A[i]) % MOD;
  45.     int res = 0;
  46.     for (int r = n; r <= m; r++){
  47.         int l = r - n + 1;
  48.         long long Sa = (S[r] - S[l-1] * H[n] + MM) % MOD;
  49.         res += (Sa == Sb);
  50.     }
  51.     cout << res << "\n";
  52.     for (int r = n; r <= m; r++){
  53.         int l = r - n + 1;
  54.         long long Sa = (S[r] - S[l-1] * H[n] + MM) % MOD;
  55.         if (Sa == Sb) cout << l << " ";
  56.     }
  57.     return 0;
  58. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement