FHQ 10pts求调
查看原帖
FHQ 10pts求调
643818
I_AK_CTS楼主2025/6/17 10:31
#include<bits/stdc++.h>
#define i64 int64_t
#define pii pair<int,int>
#define fi first
#define se second
using namespace std;
const i64 BASE=131,MOD=998244353; 
const int N=3e5+5;
mt19937 rnd(time(0));
string s;
i64 P[N];
int n,q; 
struct FHQ
{
	int sz[N],l[N],r[N],pr[N],rt,cnt;
	i64 val[N],hs[N];
	FHQ(){rt=cnt=0;}
	void upd(int x)
	{
		sz[x]=sz[l[x]]+sz[r[x]]+1;
		hs[x]=((hs[l[x]]*P[sz[r[x]]+1]%MOD+val[x]*P[sz[r[x]]]%MOD)%MOD+hs[r[x]])%MOD;
	}
	pii split(int u,int k)
	{
		if(!u) return {0,0};
		int x,y,rk=sz[l[u]]+1;
		if(rk<=k)
		{
			x=u;
			pii tmp=split(r[u],k-rk);
			y=tmp.se,r[x]=tmp.fi;
		}
		else
		{
			y=u;
			pii tmp=split(l[u],k);
			x=tmp.fi,l[y]=tmp.se;
		}
		upd(u);
		return {x,y};
	}
	int merge(int x,int y)
	{
		if(!x||!y) return x|y;
		int ans;
		if(pr[x]<pr[y])
		{
			r[x]=merge(r[x],y);
			ans=x,upd(x); 
		}
		else
		{
			l[y]=merge(x,l[y]);
			ans=y,upd(y);
		}
		return ans;
	}
	int create(int v)
	{
		val[++cnt]=hs[cnt]=v;
		pr[cnt]=rnd();
		l[cnt]=r[cnt]=0;
		sz[cnt]=1;
		return cnt;
	}
	void ins(int v,int k)
	{
		pii tmp=split(rt,k);
		rt=merge(merge(tmp.fi,create(v)),tmp.se);
	}
	void updv(int v,int k)
	{
		pii tmp=split(rt,k);
		pii TMP=split(tmp.fi,k-1);
		val[TMP.se]=hs[TMP.se]=v;
		rt=merge(merge(TMP.fi,TMP.se),tmp.se);
	}
	i64 get(int l,int r)
	{
		pii tmp=split(rt,r);
		pii TMP=split(tmp.fi,l-1);
		i64 res=hs[TMP.se];
		rt=merge(merge(TMP.fi,TMP.se),tmp.se);
		return res;
	}
}T;
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0); 
	P[0]=1;
	for(int i=1;i<=N-5;i++)
		P[i]=P[i-1]*BASE%MOD;
	cin>>s;n=s.size();
	for(int i=0;i<n;i++)
		T.ins(s[i]-'a',i+1);
	cin>>q;
	while(q--)
	{
		char op;cin>>op; 
		if(op=='R')
		{
			int x;char d;
			cin>>x>>d;
			T.updv(d-'a',x);
		}
		else if(op=='I')
		{
			int x;char d;
			cin>>x>>d;
			T.ins(d-'a',x);
		}
		else
		{
			int x,y,res=0;cin>>x>>y;
			if(x>y) swap(x,y);
			for(int i=20;~i;i--)
			{
				int nw=res+(1<<i);
				if(y+nw-1>T.sz[T.rt]) continue;
				if(T.get(x,x+nw-1)==T.get(y,y+nw-1)) res=nw;
			}
			cout<<res<<"\n";
		}
	}
	return 0;
}
2025/6/17 10:31
加载中...