0pts求条
查看原帖
0pts求条
1029048
luogu_starblue楼主2024/3/17 17:39
#include<bits/stdc++.h>
#define ll unsigned long long
using namespace std;
const int base=233;
const int mod1=1e9+7;
const int mod2=1e9+9;
const int maxn=1e5+9;
struct node
{
	int fir,sec;
};
ll p[maxn];
struct NODE
{
	
	ll hs;
	int l,r,rnd,size;
	char c;
}t[maxn];
void update(int x)
{
	t[x].size=t[t[x].l].size+t[t[x].r].size+1;
	t[x].hs=((t[t[x].l].hs+(t[x].c*p[t[t[x].l].size]))+(t[t[x].r].hs*p[(t[t[x].l].size+1)]));
}
int cnt,root;
int new_node(int v)
{
	t[++cnt].c=v;
	t[cnt].rnd=rand();
	t[cnt].size=1;
	t[cnt].hs=v;
	return cnt;
}
node split(int a,int k)
{
	if(!a)return {0,0};
	if(t[t[a].l].size>=k)
	{
		node now=split(t[a].l,k);
		t[a].l=now.sec;
		update(a);
		return {now.fir,a};
	}
	else
	{
		node now=split(t[a].r,k-t[t[a].l].size-1);
		t[a].r=now.fir;
		update(a);
		return {a,now.sec};
	}
}
int merge(int a,int b)
{
	if(!a||!b)return a+b;
	if(t[a].rnd<t[b].rnd)
	{
		t[b].l=merge(a,t[b].l);
		update(b);
		return b;
	}
	else
	{
		t[a].r=merge(t[a].r,b);
		update(a);
		return a;
	}
}
bool check(int r,int x,int y)
{
	node now1=split(root,x-1);
	node now2=split(now1.sec,r);
	ll a=t[now2.fir].hs;
	
	root=merge(merge(now1.fir,now2.fir),now2.sec);
	now1=split(root,y-1);
	now2=split(now1.sec,r);
	ll b=t[now2.fir].hs;
	root=merge(merge(now1.fir,now2.fir),now2.sec);
	//printf("%d %d %d %d %d\n",r,a.a,a.b,b.a,b.b);
	return a==b;
}
signed main()
{
	p[0]=1;
	for(int i=1;i<=1e5;i++)
	{
		p[i]=p[i-1]*base;
	}
	string s;
	cin>>s;
	for(int i=0;s[i];i++)
	{
		node now=split(root,i);
		root=merge(merge(now.fir,new_node(s[i])),now.sec);
	}
//	//cout<<root<<endl;
//	for(int i=1;i<=3;i++)
//	{
//		printf("%d %d %d %d %c\n",t[i].l,t[i].r,t[i].hs.a,t[i].hs.b,t[i].c);
//	}
	int m;
	scanf("%d",&m);
	while(m--)
	{
		char opt;
		cin>>opt;
		if(opt=='Q')
		{
			int x,y;
			scanf("%d%d",&x,&y);
			int ans=0;
			int l=0,r=cnt;
			while(l<=r)
			{
				int mid=(l+r)>>1;
//				if(max(x,y)+mid-1>cnt)
//				{
//					r=mid-1;
//					continue;
//				}
				if(check(mid,x,y))
				{
			//		printf("%d %d %d\n",x,y,mid);
					ans=mid;
					l=mid+1;
				}
				else
				{
					r=mid-1;
				}
			}
			printf("%d\n",ans);
		}
		else if(opt=='R')
		{
			int x;
			char d;
			cin>>x>>d;
			node now1=split(root,x);
			node now2=split(now1.fir,x-1);
			t[now2.sec].c=d;t[now2.sec].hs=d;
			root=merge(merge(now2.fir,now2.sec),now1.sec);
		}
		else 
		{
			int x;
			char d;
			cin>>x>>d;
			node now=split(root,x);
			root=merge(merge(now.fir,new_node(d)),now.sec);
		}
	}
} 
2024/3/17 17:39
加载中...