50pts FHQ-Treap 求调
查看原帖
50pts FHQ-Treap 求调
677356
syzyc楼主2025/7/23 16:25

已经调了六个小时了,还不知道错在哪。。。

#include <bits/stdc++.h>

#define ull unsigned long long

using namespace std;

const int maxn = 1e5 + 7;
const ull P    = 131;

int Q;
string s;

ull pw[maxn];

int rt;
struct Treap {
	int nds;
	int ls[maxn], rs[maxn];
	int siz[maxn], pri[maxn];
	ull val[maxn], hsh[maxn];
	void pushup(int p) {
		siz[p] = siz[ls[p]] + siz[rs[p]] + 1;
		hsh[p] = hsh[ls[p]] * pw[siz[rs[p]] + 1] +
				 val[p] * pw[siz[rs[p]]] + hsh[rs[p]];
	}
	void split(int p, int k, int& x, int& y) {
//		puts("split");
		if (!p) {x = y = 0; return ;}
		if (siz[ls[p]] + 1 <= k)
			x = p, split(rs[p], k - siz[ls[p]] - 1, rs[x], y);
		else y = p, split(ls[p], k, x, ls[y]);
		pushup(p);
	}
	int merge(int x, int y) {
//		puts("merge");
		if (!x || !y) return x + y;
		if (pri[x] < pri[y]) {
			rs[x] = merge(rs[x], y);
			pushup(x); return x;
		} else {
			ls[y] = merge(x, ls[y]);
			pushup(y); return y;
		}
	}
	void insert(int pos, ull v) {
		int x = 0, y = 0;
		split(rt, pos, x, y);
		++nds;
		siz[nds] = 1, pri[nds] = rand();
		val[nds] = hsh[nds] = v;
		rt = merge(merge(x, nds), y);
	}
	void mdf(int pos, ull v) {
		int x = 0, y = 0, z = 0;
		split(rt, pos - 1, x, y);
		split(y, 1, y, z);
		val[y] = v;
		rt = merge(x, merge(y, z));
	}
	ull ask(int pos, int len) {
		int x = 0, y = 0, z = 0;
		split(rt, pos - 1, x, y);
		split(y, len, y, z);
		ull res = hsh[y];
		rt = merge(x, merge(y, z));
		return res;
	}
	void print(int p) {
		if (!p) return ;
		printf("p:%d, ls:%d, rs:%d, siz:%d, pri:%d, val:%lld, hush:",
				p, ls[p], rs[p], siz[p], pri[p], val[p]), cout << hsh[p] << endl;
		print(ls[p]), print(rs[p]);
	}
} tr;
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	
	srand(0);
	
	pw[0] = 1;
	for (int i = 1; i <= 1e5; ++i)
		pw[i] = pw[i - 1] * P;
	
	cin >> s >> Q;
	
	for (int i = 0; i < s.size(); ++i)
		tr.insert(i + 1, s[i] - 'a' + 1);
	
//	tr.print(rt);
	
//	puts("ok");
	while (Q--) {
		char op, c; int x, y;
		cin >> op >> x;
		if (op == 'Q') {
			cin >> y;
			int l = 0, r = tr.siz[rt] - max(x, y) + 1;
			int res = 0;
			while (l <= r) {
				int mid = l + r >> 1;
//				printf("l:%d, r:%d, mid:%d\n", l, r, mid);
				if (tr.ask(x, mid) == tr.ask(y, mid))
					res = mid, l = mid + 1;
				else r = mid - 1;
			}
			printf("%d\n", res);
		} else {
			cin >> c, y = c - 'a' + 1;
			if (op == 'R') tr.mdf(x, y);
			else tr.insert(x, y);
		}
	}
	return 0;
}
2025/7/23 16:25
加载中...