线段树WA 30求调
查看原帖
线段树WA 30求调
745332
Henry2012楼主2025/6/20 23:18

rt,调了一晚上了

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=3e5+7,M=1e9+7,P=131;
mt19937_64 rd(time(0));
int pw[N],loc[N],pos[N],h[30],a[N],n,q,k;
char s[N],op[5];
struct Node{
	int len,hs;
};
Node operator+ (Node x,Node y){
	return {x.len+y.len,(x.hs*pw[y.len]%M+y.hs)%M};
}
struct SegmentTree{
	#define ls u*2
	#define rs u*2+1
	#define lson ls,l,mid
	#define rson rs,mid+1,r
	Node tr[N<<2];
	void pushup(int u){
		tr[u]=tr[ls]+tr[rs];
	}
	void update(int u,int l,int r,int x,int k){
		if (l==r){
			tr[u]={1,h[k]};
			return ;
		}
		int mid=l+r>>1;
		if (x<=mid) update(lson,x,k);
		else update(rson,x,k);
		pushup(u);
	}
	Node query(int u,int l,int r,int ql,int qr){
		if (l>=ql && r<=qr) return tr[u];
		if (l>qr || r<ql || ql>qr) return {0,0};
		int mid=l+r>>1;
		return query(lson,ql,qr)+query(rson,ql,qr);
	}
} seg;
struct BIT{
	int tr[N];
	void add(int x,int y){
		if (x==0) x=1;
		while (x<=k) tr[x]+=y,x+=x&(-x);
	}
	int ask(int x){
		int ans=0;
		while (x) ans+=tr[x],x&=x-1;
		return ans;
	}
	int calc(int x){
		int l=x,r=k,ans;
		while (l<=r){
			int mid=l+r>>1;
			if (ask(mid)>=x) r=mid-1,ans=mid;
			else l=mid+1;
		}
		return ans+1;
	}
} bit;
struct Query{
	int op,x,y;
} qry[N];
signed main(){
	for (int i=0;i<26;++i)
		h[i]=rd()%M;
	scanf("%s%lld",s+1,&q),n=k=strlen(s+1);
	for (int i=1;i<=n;++i)
		pos[i]=i-1;
	for (int i=1,x,y;i<=q;++i){
		scanf("%s%lld",op,&qry[i].x);
		if (op[0]=='Q') qry[i].op=0,scanf("%d",&qry[i].y);
		else if (op[0]=='R') qry[i].op=1,scanf("%s",op),qry[i].y=op[0]-'a';
		else qry[i].op=2,scanf("%s",op),qry[i].y=op[0]-'a',pos[loc[i]=++k]=qry[i].x;
	}
	pw[0]=1;
	for (int i=1;i<=k;++i)
		pw[i]=pw[i-1]*P%M,bit.add(i,1);
	for (int i=k;i;--i)
		a[i]=bit.calc(pos[i]),bit.add(a[i],-1);
	for (int i=1;i<=n;++i)
		seg.update(1,1,k,a[i],s[i]-'a'),bit.add(a[i],1);
	for (int i=1;i<=q;++i){
		if (qry[i].op==0){
			int x=bit.calc(qry[i].x-1),y=bit.calc(qry[i].y-1);
			int l=1,r=n-max(qry[i].x,qry[i].y)+1,ans=0;
			while (l<=r){
				int mid=l+r>>1;
				if (seg.query(1,1,k,x,bit.calc(qry[i].x+mid-2)).hs==
					seg.query(1,1,k,y,bit.calc(qry[i].y+mid-2)).hs) ans=mid,l=mid+1;
				else r=mid-1;
			}
			printf("%d\n",ans);
		}
		else if (qry[i].op==1) seg.update(1,1,k,bit.calc(qry[i].x-1),qry[i].y);
		else seg.update(1,1,k,a[loc[i]],qry[i].y),bit.add(a[loc[i]],1),++n;
	}
	return 0;
}
2025/6/20 23:18
加载中...