Splay TLE #1 #5 80 pts 求条
查看原帖
Splay TLE #1 #5 80 pts 求条
941431
Autream楼主2024/7/16 15:56
// Problem: P4036 [JSOI2008] 火星人
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P4036
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// Author: Li_Feiy
#include<bits/stdc++.h>
#define arrout(a,n) rep(i,1,n)std::cout<<a[i]<<" "
#define arrin(a,n) rep(i,1,n)a[i]=read()
#define rep(i,x,n) for(int i=x;i<=n;i++)
#define dep(i,x,n) for(int i=x;i>=n;i--)
#define erg(i,x) for(int i=head[x];i;i=e[i].nex)
#define dbg(x) std::cout<<#x<<":"<<x<<" "
#define mem(a,x) memset(a,x,sizeeof a)
#define all(x) x.begin(),x.end()
#define arrall(a,n) a+1,a+1+n
#define PII std::pair<int,int>
#define m_p std::make_pair
#define u_b upper_bound
#define l_b lower_bound
#define p_b push_back
#define CD const double
#define CI const int
#define int long long
#define il inline
#define ss second
#define ff first
#define itn int
int read() {
    char ch=getchar();
    int r=0,w=1;
    while(ch<'0'||ch>'9') w=ch=='-'?-1:w,ch=getchar();
    while(ch>='0'&&ch<='9') r=r*10+ch-'0',ch=getchar();
    return r*w;
}
CI N=2e5+5;
int n;
std::string s;
unsigned long long p[N];
struct Splay {
	int rt,tot,fa[N],ch[N][2],val[N],size[N];
	unsigned long long hash[N];
	void maintain(int x) {size[x]=size[ch[x][0]]+size[ch[x][1]]+1;hash[x]=hash[ch[x][0]]+(unsigned long long)val[x]*p[size[ch[x][0]]]+hash[ch[x][1]]*p[size[ch[x][0]]+1];}
	int find_dir(int x) {return x==ch[fa[x]][1];}
	void del(int x) {fa[x]=ch[x][0]=ch[x][1]=val[x]=size[x];}
	void rotate(int k) {
		int y=fa[k],z=fa[y],op=find_dir(k);
		ch[y][op]=ch[k][!op];
		if(ch[k][!op]) {
			fa[ch[k][!op]]=y;
		}
		ch[k][!op]=y;
		fa[y]=k;
		fa[k]=z;
		if(z) {
			ch[z][y==ch[z][1]]=k;
		}
		maintain(y);
		maintain(k);
	}
	void splay(int k,int goal=0) {
		for(int f=fa[k];f=fa[k],f!=goal;rotate(k)) if(fa[f]!=goal) rotate(find_dir(f)==find_dir(k)?f:k);
		if(!goal) rt=k;
	}
	int find(int x) {
		int k=rt;
		while(1) {
			if(x==size[ch[k][0]]+1) return k;
			if(x<=size[ch[k][0]]) k=ch[k][0];
			else x-=size[ch[k][0]]+1,k=ch[k][1];
		}
	}
    int alloc(int v,int f) {
	    	fa[++tot]=f,size[tot]=1;
	    	val[tot]=hash[tot]=v;
	    	return tot;
    }
  	void insert(int x,int v) {
  		if(!rt) {
  			rt=alloc(v,0);
  			return ;
  		}
  		int k=find(x);
  		splay(k,0);
  		if(!ch[k][1]) {
  			ch[x][1]=alloc(v,k);
  			maintain(k);
  			return ;
  		} else {
  			k=find(x+1);
  			splay(k,rt);
  			ch[k][0]=alloc(v,k);
  			maintain(k);
  			maintain(rt);
  			return ;
  		}
  	}
	int query_hash(int l,int r) {
		int L=find(l),R=find(r);
		splay(L,0);
		if(l==r) return val[L];
		splay(R,L);
		return hash[ch[R][0]] * p[1] + val[R] + val[rt] * p[size[ch[R][0]] + 1];
	}
}tr;
signed main() {
	std::cin>>s;
	n=s.size();
	s=" "+s;
	p[0]=1;
	rep(i,1,2*n) p[i]=p[i-1]*233;
	rep(i,1,n) {
		tr.insert(i-1,s[i]-'a'+1);
	}
	int q=read();
	while(q--) {
		char op[2];
		scanf("%s",op);
		int x=read();
		if(op[0]=='Q') {
			int y=read();
			if(x>y) std::swap(x,y);
			int l=0,r=n-y+1,ans=0;
			while(l<=r) {
				int mid=l+r+1>>1;
				// dbg(l),dbg(r),puts("");
				// std::cout<<tr.query_hash(x,x+mid-1)<<"\n";
				if(tr.query_hash(x,x+mid-1)==tr.query_hash(y,y+mid-1)) l=mid+1,ans=mid;
				else r=mid-1;
			}
			std::cout<<ans<<"\n";
		} else if(op[0]=='R') {
			char ch[2];
			scanf("%s",ch);
			int k=tr.find(x);
			tr.splay(k);
			tr.val[k]=ch[0]-'a'+1;
			tr.maintain(k);
		} else {
			char ch[2];
			scanf("%s",ch);
			tr.insert(x,ch[0]-'a'+1);
			n++;
		}
	}
    return 0;
}
2024/7/16 15:56
加载中...