FHQ 哈希 30pts求调
查看原帖
FHQ 哈希 30pts求调
642011
TonyZhou2011楼主2024/4/14 15:17

过#6#7#8

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;//no u
const ll N=2e5+10;//n=1e5
ll p[N],s[N],sz[N],rd[N];
ll lc[N],rc[N],f[N],rt,cnt;
char st[N];
void push_up(ll u){
	sz[u]=sz[lc[u]]+sz[rc[u]]+1;
	ll tl=p[u]*f[sz[lc[u]]+1];
	ll tr=s[rc[u]]*f[sz[lc[u]]+2];
	s[u]=(s[lc[u]]+tl+tr);
}
ll merge(ll u,ll v){
	if(u==0||v==0) return u+v;
	ll tp;
	if(rd[u]<rd[v]) tp=u,rc[u]=merge(rc[u],v);
	else tp=v,lc[v]=merge(u,lc[v]);
	push_up(tp); return tp;
}
void split(ll u,ll &rl,ll &rr,ll k){
	if(u==0){
		rl=rr=0; return;
	}
	if(sz[lc[u]]+1<=k) rl=u,split(rc[u],rc[u],rr,k-sz[lc[u]]-1);
	else rr=u,split(lc[u],rl,lc[u],k);
	push_up(u);
}
void reset(ll x,char d){
	ll a,b,c;
	split(rt,a,b,x-1),split(b,b,c,1);//b,b,c,x
	p[b]=s[b]=d-'a'+1;
	rt=merge(a,b),rt=merge(rt,c);
}
void insert(ll x,char d){
	ll a,b; split(rt,a,b,x);
	ll c=++cnt; sz[c]=1,p[c]=s[c]=d-'a'+1,rd[c]=rand();//no sz[c]
	rt=merge(a,c),rt=merge(rt,b);
}
ll query(ll x,ll y){
    ll a,b,c;
    split(rt,a,b,x-1),split(b,b,c,y-x+1);//y->y-x
    ll tp=s[b];
    rt=merge(a,b),rt=merge(rt,c);
    return tp;
}
ll quire(ll i,ll j,ll n){
	ll l=1,r=n-max(i,j)+1,ans=0;
	while(l<=r){
		ll mid=l+r>>1;
		if(query(i,i+mid-1)==query(j,j+mid-1)){
		ans=mid,l=mid+1; }
		else r=mid-1;
	} return ans;
}
int main(){
	scanf("%s",&st);
	ll n=strlen(st),m;
	srand(998244353),f[1]=1;
	for(ll i=2;i<=n;i++) f[i]=f[i-1]*29;
	for(ll i=1;i<=n;i++){
		sz[i]=1,rd[i]=rand(),p[i]=s[i]=st[i-1]-'a'+1;//st[i],no size
		rt=merge(rt,i);
	} cnt=n;
	scanf("%lld",&m);
	for(ll i=1;i<=m;i++){
		char op[2]; ll x;
		scanf("%s%lld",&op,&x);
		if(op[0]=='Q'){
			ll y; scanf("%lld",&y);
			printf("%lld\n",quire(x,y,n));
		}else if(op[0]=='R'){
			char y[2]; scanf("%s",&y);
			reset(x,y[0]);
		}else{
			char y[2]; scanf("%s",&y);
			insert(x,y[0]);
		}
	}
	return 0;
}
2024/4/14 15:17
加载中...