Fhq-treap WA 50分求助!
查看原帖
Fhq-treap WA 50分求助!
92682
Eric_cai楼主2021/10/13 22:51
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#define maxn 200005
#define ull unsigned long long
using namespace std;
int len,n,base=137,sz[maxn],son[maxn][2],root,rd[maxn];
ull mul[maxn]={1},Hash[maxn],val[maxn];
void pushup(int id)
{
	Hash[id]=Hash[son[id][0]]+val[id]*mul[sz[son[id][0]]]+Hash[son[id][1]]*mul[sz[son[id][0]]+1];
	sz[id]=sz[son[id][0]]+sz[son[id][1]]+1;
}
void split(int id,int rk,int &x,int &y)
{
	if(id==0)
	{
		x=y=0;
		return;
	}
	if(sz[son[id][0]]>=rk)
	{
		y=id;
		split(son[id][0],rk,x,son[y][0]);
	}
	else
	{
		x=id;
		split(son[id][1],rk-sz[son[id][0]]-1,son[x][1],y);
	}
	pushup(id);
}
int merge(int x,int y)
{
	if(x==0 || y==0) return x+y;
	if(rd[x]<rd[y])
	{
		son[x][1]=merge(son[x][1],y);
		pushup(x);
		return x;
	}
	else
	{
		son[y][0]=merge(x,son[y][0]);
		pushup(y);
		return y;
	}
}
int get_hash(int x,int l)
{
	int A,B,C;
	split(root,x-1,A,B);
    split(B,l,B,C);
	int ret=Hash[B];
	root=merge(merge(A,B),C);
	return ret;
}
int get_ans(int x,int y)
{
	int l=0,r=len-max(x,y)+1,mid,ret=0;
	while(l<=r)
	{
		int mid=(l+r)/2;
		if(get_hash(x,mid)==get_hash(y,mid))
		{
			l=mid+1;
			ret=max(ret,mid);
		}
		else r=mid-1;
	}
	return ret;
}
int main()
{
	string s;
	for(int i=1;i<=15e4;i++) mul[i]=mul[i-1]*base;
	cin>>s;
	len=s.size();
	for(int i=0;i<s.size();i++)
	{
		Hash[i+1]=val[i+1]=s[i]-'a'+1;
		sz[i+1]=1;
		rd[i+1]=rand()*rand();
		root=merge(root,i+1);
	}
	scanf("%d",&n);
	int x,y;
	char opt,d;
	for(int i=1;i<=n;i++)
	{
		cin>>opt;
		scanf("%d",&x);
		if(opt=='Q')
		{
			scanf("%d",&y);
			printf("%d\n",get_ans(x,y));
		}
		if(opt=='R')
		{
			int A,B,C;
			cin>>d;
			split(root,x-1,A,B);
			split(B,x,B,C);
			Hash[B]=val[B]=d-'a'+1;
			root=merge(merge(A,B),C);
		}
		if(opt=='I')
		{
			cin>>d;
			int A,B;
			split(root,x,A,B);
			Hash[++len]=d-'a'+1;
			val[len]=Hash[len];
			sz[len]=1;
			rd[len]=rand()*rand();
			root=merge(merge(A,len),B);
		}
	}
	return 0;
}
2021/10/13 22:51
加载中...