Vserosbuybuy

Z-function, prefix-function, hash

Jun 22nd, 2020
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.69 KB | None | 0 0
  1. #include <algorithm>
  2. #include <ctime>
  3. #include <cstdlib>
  4. #include <queue>
  5. #include <iostream>
  6. #include <map>
  7. #include <math.h>
  8. #include <set>
  9. #include <string>
  10. #include <unordered_map>
  11. #include <unordered_set>
  12. #include <vector>
  13.  
  14. using namespace std;
  15.  
  16. typedef long long ll;
  17. typedef long double ld;
  18.  
  19. vector<int> simple_z(string s) {
  20.     int n = (int)s.length();
  21.     vector<int> z(n, 0);
  22.     for (int i = 1; i < n; ++i) {
  23.         while (i + z[i] < n && s[z[i]] == s[i + z[i]]) {
  24.             ++z[i];
  25.         }
  26.     }
  27.     return z;
  28. }
  29.  
  30. vector<int> z_function(string s) {
  31.     int n = (int)s.length();
  32.     vector<int> z(n, 0);
  33.     for (int i = 1, l = 0, r = 0; i < n; ++i) {
  34.         if (i <= r) {
  35.             z[i] = min(r - i + 1, z[i - l]);
  36.         }
  37.         while (i + z[i] < n && s[z[i]] == s[i + z[i]]) {
  38.             ++z[i];
  39.         }
  40.         if (i + z[i] - 1 > r) {
  41.             l = i, r = i + z[i] - 1;
  42.         }
  43.     }
  44.     return z;
  45. }
  46.  
  47. vector<int> prefix_function(string s) {
  48.     int n = (int)s.length();
  49.     vector<int> pi(n, 0);
  50.     for (int i = 1; i < n; ++i) {
  51.         int j = pi[i - 1];
  52.         while (j > 0 && s[i] != s[j]) {
  53.             j = pi[j - 1];
  54.         }
  55.         if (s[i] == s[j])  ++j;
  56.         pi[i] = j;
  57.     }
  58.     return pi;
  59. }
  60.  
  61. const ll md = 1e9 + 7;
  62. const ll x = 141;
  63. const int MAXN = 1e6;
  64.  
  65. ll degrees[MAXN];
  66. ll h[MAXN];
  67.  
  68. ll get_h(int i, int j) {
  69.     return (h[j + 1] + md - h[i] * degrees[j - i + 1] % md) % md;
  70. }
  71.  
  72. int main() {
  73. #ifdef SYSTEM
  74.     freopen("In.txt", "r", stdin);
  75.     freopen("Out.txt", "w", stdout);
  76. #endif
  77.     degrees[0] = 1;
  78.     for (int i = 1; i < MAXN; ++i) {
  79.         degrees[i] = degrees[i - 1] * x % md;
  80.     }
  81.     string s;
  82.     cin >> s;
  83.     h[0] = 0;
  84.     for (int i = 0; i < s.length(); ++i) {
  85.         h[i + 1] = h[i] * x + s[i];
  86.         h[i + 1] %= md;
  87.     }
  88.     reverse(s.begin(), s.end());
  89.     h2...
  90.     h[s.length()];
  91.     return 0;
  92. }
Advertisement
Add Comment
Please, Sign In to add comment