手写哈希求卡常
查看原帖
手写哈希求卡常
374330
yimuhua楼主2023/5/11 17:12

rt,过了LCS1

#pragma GCC target ("avx")
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast,no-stack-protector")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include <bits/stdc++.h>
using namespace std;
const int base = 131, m1 = 13331, m2 = 13331;
struct hashmap {
	int a[1000005], v[1000005];
	inline void clear() {
		memset(v, 0, sizeof(v));
		return;
	}
	inline int hash(long long x) {
		return (x % 1000005 + 1000005) % 1000005;
	}
	inline int& operator[](long long x) {
		register int cur = hash(x), cnt = 1;
		while((a[cur] ^ x) && v[cur])
			cur = (cur + cnt * cnt) % 1000005, cnt++;
		a[cur] = x;
		return v[cur];
	}
}mp, vis;
string s[15];
int n, l = -1, r;
long long p1[100005] = {1}, p2[100005] = {1}, h[15][100005], h2[15][100005];
long long H(int x, int y) {
	return 1ll * x << 14 | y;
}
long long f1(int cur, int lt, int rt) {
	return (h[cur][rt] - h[cur][lt - 1] * p1[rt - lt + 1] % m1 + m1) % m1;
}
long long f2(int cur, int lt, int rt) {
	return (h2[cur][rt] - h2[cur][lt - 1] * p2[rt - lt + 1] % m2 + m2) % m2;
}
bool check(int x) {
	mp.clear();
	for(int j = 1; j <= n; j++) {
		vis.clear();
		for(int i = 1; i + x - 1 < s[j].size(); i++)
			if(!vis[H(f1(j, i, i + x - 1), f2(j, i, i + x - 1))])
				vis[H(f1(j, i, i + x - 1), f2(j, i, i + x - 1))] = 1, mp[H(f1(j, i, i + x - 1), f2(j, i, i + x - 1))]++;
	}
	for(int i = 1; i + x - 1 < s[1].size(); i++)
		if(mp[H(f1(1, i, i + x - 1), f2(1, i, i + x - 1))] == n)
			return 1;
	return 0;
}
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	for(n = 1; cin >> s[n]; n++) {
		r = max(r, (int)s[n].size() + 1), s[n] = ' ' + s[n];
		for(int j = 1; j < s[n].size(); j++)
			h[n][j] = (h[n][j - 1] * base % m1 + s[n][j]) % m1, h2[n][j] = (h2[n][j - 1] * base % m2 + s[n][j]) % m2;
	}
	n--;
	for(int i = 1; i < r; i++)
		p1[i] = p1[i - 1] * base % m1, p2[i] = p2[i - 1] * base % m2;
	while(l + 1 < r) {
		int mid = l + r >> 1;
		if(check(mid))
			l = mid;
		else
			r = mid;
	}
	cout << l;
	return 0;
}
2023/5/11 17:12
加载中...