FHQ-Treap 哈希 WA 10pts 求调
查看原帖
FHQ-Treap 哈希 WA 10pts 求调
482610
Mortidesperatslav楼主2024/4/7 21:01
#include<bits/stdc++.h>
#define mxn 1000005
using namespace std;
unsigned long long hsh[mxn];
struct node{
	int ls, rs, vl, nc, siz, ct, ch;//nc = nonce, 随机值 
	unsigned long long w;
}tr[mxn];
int cnt, rt, q, ta, tb, tc, tot, n, m;
int nw(int x){
	tr[++cnt].vl = x;
	tr[cnt].nc = rand();
	tr[cnt].siz = 1;
	tr[cnt].ct = 1;
	return cnt;
}
void pup(int u){
	tr[u].siz = tr[tr[u].ls].siz + tr[tr[u].rs].siz + tr[u].ct;
	tr[u].w = tr[tr[u].ls].w * hsh[tr[tr[u].rs].siz + 1] + hsh[tr[tr[u].rs].siz] * tr[u].ch + tr[tr[u].rs].w;
}
int mg(int u, int v){
	if (!u || !v)
		return u | v;
	if (tr[u].nc < tr[v].nc){
		tr[u].rs = mg(tr[u].rs, v);
		pup(u);
		return u;
	}else{
		tr[v].ls = mg(u, tr[v].ls);
		pup(v);
		return v;
	}
}
void spt(int u, int x, int &a, int &b){
	if (!u){
		a = 0;
		b = 0;
	}else{
		if (x <= tr[tr[u].ls].siz){
			b = u;
			spt(tr[u].ls, x, a, tr[u].ls);
		}else{
			a = u;
			spt(tr[u].rs, x - tr[tr[u].ls].siz - 1, tr[u].rs, b);
		}
		pup(u);
	}
}
void ins(int u, char c){
	int ta, tb;
	spt(rt, u, ta, tb);
	tr[++tot].w = c - 96;
	tr[tot].ch = c - 96;
	tr[tot].siz = 1;
	tr[tot].nc = rand();
	rt = mg(mg(ta, tot), tb);
}
void del(int u){
	int ta, tb, tc;
	spt(rt, u, ta, tc);
	spt(ta, u - 1, ta, tb);
	tb = mg(tr[tb].ls, tr[tb].rs);
	rt = mg(mg(ta, tb), tc);
}
long long qry(int l, int r){
	int le = r - l + 1;
	int ta, tb, tc, td;
	spt(rt, l - 1, ta, tb);
	spt(tb, le, tc, td);
	unsigned long long res = tr[tc].w;
	rt = mg(ta, mg(tc, td));
	return res;
}
bool fd(int u, int v, int mid){
	unsigned long long ans = qry(u, u + mid - 1), aans = qry(v, v + mid - 1);
	if (ans == aans)
		return 1;
	else
		return 0;
}
string a, b;
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin >> b >> m;
	a = " ";
	a += b;
	n = a.size() - 1;
	hsh[0] = 1;
	for (int i = 1; i < mxn; i++)
		hsh[i] = hsh[i - 1] * 27;
	for (int i = 1; i <= n; i++)
		ins(i, a[i]);
	for (int i = 1; i <= m; i++){
		char op;
		int u, v;
		cin >> op >> u;
		if (op == 'Q'){
			cin >> v;
			int l = 1, r = min(n - u + 1, n - v + 1), res = 0;
			while (l <= r){
				int mid = (l + r) >> 1;
				if (fd(u, v, mid))
					res = mid, l = mid + 1;
				else
					r = mid - 1;
			}
			cout << res << "\n";
		}else if (op == 'R'){
			del(u);
			char qwq;
			cin >> qwq;
			ins(u - 1, qwq);
		}else{
			n++;
			char qwq;
			cin >> qwq;
			ins(u, qwq);
		}
	}
}
2024/4/7 21:01
加载中...