我发现这个哈希没法正确匹配合适的字符串/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;
}