哈希求助
查看原帖
哈希求助
526017
COsm0s楼主2024/8/28 08:15
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb emplace_back
#define ull unsigned long long
const int N = 1e5 + 5, base = 1e9 + 7, mod = 1e9 + 9;
const long long inf = 0x3f3f3f3f3f3f3f3f;
char s[N], t[N];
int n, ans, hs1[30][N], hs2[30][N], pw[N];
int pos1[N], pos2[N], st1[N], st2[N], m;
vector<int> p1[30], p2[30];
int get1(int l, int r, int i) {
	if(l > r) return 0;
	return hs1[i][r] - 1ll * hs1[i][l - 1] * pw[r - l + 1];
}
int get2(int l, int r, int i) {
	if(l > r) return 0;
	return hs2[i][r] - 1ll * hs2[i][l - 1] * pw[r - l + 1];
}
bool check(int k) {
	unordered_map<ull, bool> mp;
	for (int i = 0; i < 26; i ++) st1[i] = st2[i] = 0, pos1[i] = pos2[i] = -1;
	for (int i = 1; i <= m - k + 1; i ++) {
		vector<int> o2;
		for (int j = 0; j < 26; j ++) {
			while (pos2[j] + 1 < (int)p2[j].size() && p2[j][pos2[j] + 1] <= i + k - 1) pos2[j] ++;
			while (st2[j] + 1 < (int)p2[j].size() && p2[j][st2[j]] < i) st2[j] ++;
			if(p2[j].size()) o2.pb((1ll * get2(st2[j] + 1, pos2[j], j) * base + (i + k - p2[j][pos2[j]])));
		}
		sort(o2.begin(), o2.end());
		ull sum2 = 0;
		for (int e : o2) sum2 = sum2 * mod + e;
		mp[sum2] = 1;
	}
	for (int i = 1; i <= n - k + 1; i ++) {
		vector<int> o1;
		for (int j = 0; j < 26; j ++) {
			while (pos1[j] + 1 < (int)p1[j].size() && p1[j][pos1[j] + 1] <= i + k - 1) pos1[j] ++;
			while (st1[j] + 1 < (int)p1[j].size() && p1[j][st1[j]] < i) st1[j] ++;
			if(p1[j].size()) o1.pb((1ll * get1(st1[j] + 1, pos1[j], j) * base + (i + k - p1[j][pos1[j]])));
		}
		sort(o1.begin(), o1.end());
		ull sum1 = 0;
		for (int e : o1) sum1 = sum1 * mod + e;
		if(mp.count(sum1)) return 1;
	}
	return 0;
}
void Solve() {
	cin >> (s + 1) >> (t + 1);
	n = strlen(s + 1), m = strlen(t + 1), pw[0] = 1;
	for (int i = 1; i <= n; i ++)
		p1[s[i] - 97].pb(i);
	for (int i = 1; i <= m; i ++)
		p2[t[i] - 97].pb(i);
	for (int i = 1; i <= max(n, m); i ++)
		pw[i] = 1ll * pw[i - 1] * base;
	for (int i = 0; i < 26; i ++) {
		for (int j = 0; j < (int)p1[i].size() - 1; j ++) {
			hs1[i][j + 1] = (1ll * hs1[i][j] * base + p1[i][j + 1] - p1[i][j]);
		}
		for (int j = 0; j < (int)p2[i].size() - 1; j ++) {
			hs2[i][j + 1] = (1ll * hs2[i][j] * base + p2[i][j + 1] - p2[i][j]);
		}
	}
	int l = 1, r = max(n, m), ans = 1;
	while (l <= r) {
		int mid = l + r >> 1;
		if (check(mid)) l = mid + 1, ans = mid;
		else r = mid - 1;
	}
	printf("%lld\n", ans);
}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr), cout.tie(nullptr);
	int T = 1;
//	cin >> T;
	while (T --) {
		Solve();
	}
	return 0;
}

求调 8585 pts,WA on #4#6#7.

2024/8/28 08:15
加载中...