求问关于哈希基数
查看原帖
求问关于哈希基数
414231
_Fatalis_楼主2024/10/19 13:27
// Copyright 2024 Lotuses
#include <bits/stdc++.h>

template<typename T>
void read(T &r) { r = 0; static char ch, last; ch = getchar(), last = 'z'; while (ch < '0' || ch > '9') last = ch, ch = getchar(); while (ch >= '0' && ch <= '9') r = (r << 1) + (r << 3) + (ch ^ 48), ch = getchar(); r = (last == '-') ? -r : r; }
template<typename T, typename...Ts>
void read(T &arg, Ts&...arg_left) { read(arg); read(arg_left...); }

// #define int long long
typedef long long ll;
typedef unsigned long long ull;
typedef std::vector<int> vi;
typedef std::pair<int, int> pii;
#define sint static int
const int maxn = 1e6 + 10;

std::mt19937_64 mt;
char s[maxn], t[maxn];
ull h1[26], h2 = 1997, st[maxn], h3 = 1, x;
std::vector<char> v;
int f[maxn], sl = 0;

int main() {
    // freopen(".in", "r", stdin);
    // freopen(".out", "w", stdout);

    for (int i = 0; i < 26; i++) {
        h1[i] = mt();
    }
    
    scanf("%s%s", s + 1, t + 1);
    int n = strlen(s + 1), m = strlen(t + 1);

    for (int i = 1; i <= m; i++) {
        x *= h2; x += h1[t[i] - 'a'];
        if (i < m) st[i] = st[i - 1] * h2 + h1[s[i] - 'a'], f[i] = i; h3 *= h2;
    }
    sl = m - 1;
    for (int i = m; i <= n; i++) {
        sl++;
        st[sl] = st[sl - 1] * h2 + h1[s[i] - 'a'];
        f[sl] = i;
        if (sl >= m && st[sl] - st[sl - m] * h3 == x) {
            sl = sl - m;
            // puts("?");
        }
    }
    for (int i = 1; i <= sl; i++) putchar(s[f[i]]);
    puts("");
    return 0;
}

h2=19937h2 = 19937 时被最后一个点卡爆了。请问这是为什么呢,19937 有很强的性质吗?

2024/10/19 13:27
加载中...