WA30,别的地方好像都能过,求查错
查看原帖
WA30,别的地方好像都能过,求查错
18857
displaylzy楼主2021/8/19 21:25
#include<bits/stdc++.h>

#define N 100005

using namespace std;

typedef unsigned long long ull;

ull mi[N*5], key[N*5], val[N*5];
int son[N*5][2], siz[N*5], f[N*5], rootd, notd, n;
char s[N];

int get(int x) {
	return (son[f[x]][1] == x);
}

int New(ull num) {
	key[++notd] = val[notd] = num; siz[notd] = 1;
	return notd;
}

void update(int x) {
	if (!x) return;
	int lson = son[x][0], rson = son[x][1];
	key[x] = key[lson]*mi[siz[rson]+1]+val[x]*mi[siz[rson]]+key[rson];
	siz[x] = siz[lson]+1+siz[rson]; 
}

void rotate(int &x) {
	int fa = f[x], fafa = f[fa]; int num = get(x);
	son[fa][num] = son[x][num^1]; f[son[fa][num]] = fa;
	son[x][num^1] = fa; f[fa] = x; f[x] = fafa;
	if (fafa) son[fafa][son[fafa][1] == fa] = x;
	update(fa); update(x);	
}

void splay(int x, int y) {
	int fa = f[x];
	for (; fa != y; fa = f[x]) {
		if (f[fa] != y) rotate((get(fa) == get(x)) ? fa : x); 
		rotate(x);
	}
	if (!y) rootd = x;
}

int Build(int l, int r, int fa) {
    if (l > r) { return 0; }
    if (l == r) { key[l] = val[l]; f[l] = fa, siz[l] = 1; return l; }
	int mid = (l + r)>>1;
    f[mid] = fa;   
	son[mid][0] = Build(l, mid - 1, mid);
    son[mid][1] = Build(mid + 1, r, mid);
    update(mid);    
    return mid;
}
 
int GetRanknumID(int now, int x) { 
	int cdp = (son[now][0] ? siz[son[now][0]] : 0);
	if (x <= cdp) return GetRanknumID(son[now][0], x);
		else {
		    if (x == cdp+1) return now; 
			return GetRanknumID(son[now][1], x-(cdp+1));
		}
	return 0;
}

void work(int x, int y) {
	int len1 = siz[rootd]-2;
	int L = 1, R = min(len1-x+1, len1-y+1), ans = 0;
	int orz1, odp1, orz2, odp2;	
	ull num1, num2;
	while (L <= R) {
		int mid = (L+R)>>1;
		orz1 = GetRanknumID(rootd, x+1-1);
		odp1 = GetRanknumID(rootd, x+1+mid-1+1); 
		splay(orz1, 0); splay(odp1, orz1);
		num1 = key[son[odp1][0]];
		orz2 = GetRanknumID(rootd, y+1-1);
		odp2 = GetRanknumID(rootd, y+1+mid-1+1);
		splay(orz2, 0); splay(odp2, orz2);
		num2 = key[son[odp2][0]];
		if (num1 == num2) ans = mid, L = mid+1; else R = mid-1;
	}
	printf("%d\n", ans);
}

int main() {
	freopen("10.in", "r", stdin);
	freopen("data.out", "w", stdout); 
	mi[0] = 1; for (int i = 1; i <= 500000; i++) mi[i] = 131ull*mi[i-1];
	scanf("%s", s+1); int slen = strlen(s+1);
	val[1] = 0; for (int i = 2; i <= slen+1; i++) val[i] = s[i-1]-'a'; val[slen+2] = 0;
	rootd = Build(1, slen+2, 0); notd = slen+2;
	int x, y; char opt[10], d[10]; 
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		scanf("%s", opt+1);
		if (opt[1] == 'Q') scanf("%d%d", &x, &y), work(x, y);
		if (opt[1] == 'R') {
			scanf("%d", &x); scanf("%s", d+1);
			int orz1 = GetRanknumID(rootd, x+1);
			splay(orz1, 0);
			val[orz1] = d[1]-'a'; update(orz1); 
		} 
		if (opt[1] == 'I') {
			scanf("%d", &x); scanf("%s", d+1);
			int orz1 = GetRanknumID(rootd, x+1);
			int orz2 = GetRanknumID(rootd, x+2);
			splay(orz1, 0); splay(orz2, orz1);
			son[orz2][0] = New(d[1]-'a'); f[son[orz2][0]] = orz2;
			update(orz2); update(orz1);
		}
	}
	return 0;
}
2021/8/19 21:25
加载中...