已经调了六个小时了,还不知道错在哪。。。
#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;
}