求调 30pts
查看原帖
求调 30pts
501947
DengDuck鄧德楼主2024/3/8 13:35
#include<bits/stdc++.h>
#define LL unsigned long long
#define ls(x) t[x].l
#define rs(x) t[x].r
const LL N=1e6+5;
const LL P=29;
using namespace std;
struct node
{
	LL l,r,sz;
	LL hsh,val;
	LL pri;
}t[N];
LL n,rt,tot,a[N];
LL Pw[N];
LL Make(LL x)
{
	t[++tot]={0ll,0ll,1ll,x,x,(LL)(rand())};
	return tot;
}
void Up(LL x)
{
	t[x].sz=t[ls(x)].sz+t[rs(x)].sz+1;
	t[x].hsh=(t[ls(x)].hsh*Pw[t[rs(x)].sz+1]+t[x].val*Pw[t[rs(x)].sz]+t[rs(x)].hsh);
	
}
void Mrg(LL &rt,LL x,LL y)
{
	if(!x||!y)rt=x+y;
	else
	{
		if(t[x].pri<t[y].pri)rt=x,Mrg(rs(x),rs(x),y);
		else rt=y,Mrg(ls(y),x,ls(y));
		Up(rt);
	}
}
void Spl(LL rt,LL &x,LL &y,LL v)
{
	if(!rt)x=y=0;
	else
	{
		if(t[ls(rt)].sz<v)x=rt,Spl(rs(x),rs(x),y,v-t[ls(rt)].sz-1);
		else y=rt,Spl(ls(y),x,ls(y),v);
		Up(rt);
	}
}
LL Hsh(LL x,LL y)
{
	LL rt1=0,rt2=0,rt3=0;
	Spl(rt,rt1,rt3,y),Spl(rt1,rt1,rt2,x-1);
	LL hsh=t[rt2].hsh;
	Mrg(rt1,rt1,rt2),Mrg(rt,rt1,rt3);
	return hsh;
}
LL m;
char c[N];
bool pd(LL x,LL s,LL e)
{
	LL Lhsh=Hsh(s,s+x-1),Rhsh=Hsh(e,e+x-1);
	return Lhsh==Rhsh;
}
char op[35],s[35];
int main()
{
	freopen("in","r",stdin);
	freopen("out","w",stdout);
	srand(time(0));
	scanf("%s%llu",c+1,&m);
	n=strlen(c+1);
	Pw[0]=1;
	for(LL i=1;i<=N-1;i++)Pw[i]=Pw[i-1]*P;
	for(LL i=1;i<=n;i++)Mrg(rt,rt,Make(c[i]-'a'));

	while(m--)
	{
		
		scanf("%s",op);
		if(op[0]=='Q')
		{
			LL x,y;
			scanf("%llu%llu",&x,&y);
			if(x<y)swap(x,y);
			LL l=1,r=min(t[rt].sz-x+1,t[rt].sz-y+1),ans=0;
			while(l<=r)
			{
				LL mid=(l+r)/2;
				if(pd(mid,x,y))ans=mid,l=mid+1;
				else r=mid-1;
			}

			printf("%llu\n",ans);
		}
		else
		{
			LL x;
			scanf("%llu",&x);
			scanf("%s",s);
			LL rt1=0,rt2=0,rt3=0;
			Spl(rt,rt1,rt3,x),Spl(rt1,rt1,rt2,x-1);
			//	cout<<t[rt1].sz<<' '<<t[rt2].sz<<' '<<t[rt3].sz<<endl;
			assert(t[rt2].sz==1);
			Mrg(rt1,rt1,Make(s[0]-'a'));
			if(op[0]=='I')Mrg(rt1,rt1,rt2);
			Mrg(rt,rt1,rt3);
			//	cout<<t[rt].hsh<<endl;
		}
		//		for(LL i=1;i<=t[rt].sz;i++)
		//		{
		//			printf("%lld ",Gt(rt,i));
		//		}
		//	putchar('\n');
	}
}
2024/3/8 13:35
加载中...