萌新求教,WA 30,debug 半天无果
查看原帖
萌新求教,WA 30,debug 半天无果
44805
Leap_Frog楼主2020/11/28 19:55

rt,用 fhq 维护 Hash。
感觉代码没有问题,部分重构了后一样。

//愿你和你重要的人能够再次重逢!
#include<bits/stdc++.h>
using namespace std;
template<typename T>inline void read(T &x)
{
	x=0;char c=getchar(),f=0;
	for(;c<'0'||c>'9';c=getchar()) if(!(c^45)) f=1;
	for(;c>='0'&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
	if(f) x=-x;
}
typedef long long ull;
const ull Bas=137,P=1e9+7;ull bas[2000005],tmp;char c[2000005];
struct node{ull vl,nw;int ls,rs,sz;}t[2000005];int n,Q,rt,tt;
inline void pushup(int x)
{
	t[x].sz=t[t[x].ls].sz+t[t[x].rs].sz+1;
	t[x].vl=(t[t[x].ls].vl*bas[t[t[x].rs].sz+1]%P+t[x].nw*bas[t[t[x].rs].sz]%P+t[t[x].rs].vl%P)%P;
}
inline char Rnd(int x,int y) {return rand()%(x+y)<x;}
inline void split(int x,int k,int &a,int &b)
{
	if(!x) return(void)(a=b=0);
	if(k<=t[t[x].ls].sz) b=x,split(t[x].ls,k,a,t[b].ls),pushup(b);
	else a=x,split(t[x].rs,k-t[t[x].ls].sz-1,t[a].rs,b),pushup(a);
}
inline int mrg(int a,int b)
{
	if(!a||!b) return a|b;else if(!(a^b)) return a;
	if(Rnd(t[a].sz,t[b].sz)) return t[a].rs=mrg(t[a].rs,b),pushup(a),a;
	else return t[b].ls=mrg(a,t[b].ls),pushup(b),b;
}
inline void build(int &x,int l,int r,char *c)
{
	if(l>r) return(void)(x=0);else x=++tt,t[x]=(node){(ull)(c[(l+r)>>1]-'a'+1),(ull)(c[(l+r)>>1]-'a'+1),0,0,1};
	build(t[x].ls,l,((l+r)>>1)-1,c),build(t[x].rs,((l+r)>>1)+1,r,c),pushup(x);
}
inline void ins(int x,ull w) {int a,b;split(rt,x,a,b),t[++tt]=(node){w,w,0,0,1},rt=mrg(a,mrg(tt,b));}
inline ull qry(int l,int r) {int a,b,c;return split(rt,r,b,c),split(b,l-1,a,b),tmp=t[b].vl,rt=mrg(a,mrg(b,c)),tmp;}
inline void chang(int x,ull w) {int a,b,c;split(rt,x-1,a,b),split(b,1,b,c),t[b]=(node){w,w,0,0,1},rt=mrg(a,mrg(b,c));}
inline void debug(int x) {if(x) debug(t[x].ls),putchar(t[x].nw+'a'-1),debug(t[x].rs);}
int main()
{
	srand(time(0)),scanf("%s",c+1),read(Q),n=strlen(c+1),bas[0]=1;
	for(int i=1;i<=n;i++) bas[i]=bas[i-1]*Bas%P;
	for(build(rt,1,n,c);Q--;)
	{
		scanf("%s",c);int l,r;read(l);
		if(*c=='R') {scanf("%s",c),chang(l,*c-'a'+1);continue;}
		else if(*c=='I') {scanf("%s",c),ins(l,*c-'a'+1);continue;}
		read(r);int le=0,ri=min(n-r,n-l),md=0,res=-1;
		while(le<=ri) {md=(le+ri)>>1;if(qry(l,l+md)==qry(r,r+md)) res=md,le=md+1;else ri=md-1;}
		printf("%d\n",res+1);
	}
	return 0;
}
2020/11/28 19:55
加载中...