哈希,离散化

P10469 后缀数组

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ull unsigned long long
const int N = 1e6 + 10;
const int base = 13331;
string s;
int a[N];
ull pw[N], hs[N];
int len;
ull has(int l, int r) {
	return hs[r] - hs[l - 1] * pw[r - l + 1];
}
int sa(int a, int b) {
	int l = 0, r = min(len - a, len - b) + 1;
	while (l < r) {
		int mid = (l + r + 1) / 2;
		if (has(a, a + mid - 1) == has(b, b + mid - 1)) l = mid;
		else r = mid - 1;
	}
	return l;
}
bool cmp(int x, int y) {
	int len = sa(x, y);
	if (s[len + x] < s[len + y]) return 1;
	else return 0;
}

signed main() {
	cin >> s;
	len = s.size();
	pw[0] = 1;
	s = ' ' + s;
	for (int i = 1; i <= len; i++) {
		hs[i] = hs[i - 1] * base + s[i];
		pw[i] = pw[i - 1] * base;
		a[i] = i;
	}
	sort(a + 1, a + 1 + len, cmp);
	for (int i = 1; i <= len; i++) cout << a[i] - 1 << ' ';
	cout << '\n';
	for (int i = 0; i < len; i++) cout << sa(a[i], a[i + 1]) << ' ';
	cout << '\n';
}

P10468 兔子与兔子

#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef unsigned long long ull;
const int N = 1e6 + 10;
const int base = 998244353;
ull pw[N], ha[N];
string s;
int t;
ull hs(int l, int r) {
	return ha[r] - ha[l - 1] * pw[r - l + 1];
}
signed main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	cin >> s >> t;
	s = ' ' + s;
	int len = s.size();
	pw[0] = 1;
	for (int i = 1; i <= len; i++) {
		ha[i] = ha[i - 1] * base + s[i];
		pw[i] = pw[i - 1] * base;
	}
	while (t--) {
		int l1, r1, l2, r2;
		cin >> l1 >> r1 >> l2 >> r2;
		ull a = hs(l1, r1);
		ull b = hs(l2, r2);
		if (a == b) cout << "Yes\n";
		else cout << "No\n";
	}
}
posted @ 2024-07-05 17:48  ZhangDT  阅读(4)  评论(0)    收藏  举报