为什么这个哈希没法匹配上/yun
查看原帖
为什么这个哈希没法匹配上/yun
482610
Mortidesperatslav楼主2024/10/29 07:45

我发现这个哈希没法正确匹配合适的字符串/yun

不是很理解

#include<bits/stdc++.h>
using namespace std;
string s[1000005], t[1000005];
int n, m, l, r, hs, ans, pw = 1, pw2 = 1;
int base = 821;
unordered_map<string, int> mp, mpp;
int ls[1000005], nx[1000005], lt[1000005], pww[1000005];
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	string tmp;
	while (cin >> tmp){
		if (tmp == "$")
			break;
		s[++n] = tmp;
	}
	while (cin >> tmp){
		if (tmp == "$")
			break;
		t[++m] = tmp;
	}
	pww[0] = 1;
	for (int i = 1; i <= n; i++)
		pww[i] = pww[i - 1] * base;
	memset(ls, -1, sizeof ls);
	for (int i = 1; i <= n; i++){
		if (mp[s[i]])
			ls[i] = i - mp[s[i]], nx[mp[s[i]]] = i;
		mp[s[i]] = i;
	}
	memset(lt, -1, sizeof lt);
	for (int i = 1; i <= m; i++){
		if (mpp[t[i]])
			lt[i] = i - mpp[t[i]];
		mpp[t[i]] = i;
	}
	l = 1, r = m;
	for (int i = l; i <= r; i++){
		hs += ls[i] * pw;
		ans += lt[i] * pw;
		pw *= base;
	}
	if (hs == ans){
		cout << "1";
		return 0;
	}
	while (r <= n){
		hs -= ls[l] * pw2;
		if (nx[l] <= r)
			hs -= (ls[nx[l]] + 1) * pww[nx[l]];
		ls[nx[l]] = -1;
		l++;
		pw2 *= base;
		hs += ls[++r] * pw;
		ans *= base;
	//	cout << l << " " << hs << " " << ans << "\n";
		if (hs == ans){
			cout << l;
			return 0;
		}
		pw *= base;
	}
	return 0;
}
2024/10/29 07:45
加载中...