求助!跳不出样例!
查看原帖
求助!跳不出样例!
712994
ggcggc楼主2024/4/7 20:05

求助万能的谷民!!!

调不出样例,一直循环。。。

请大牛帮忙调下 code ,悬赏一个关注。

#include<iostream>
#include<string.h>
#include<string>
#include<stdio.h>
#include<algorithm>
#define ri register int
#define uint unsigned 
#define N 505050
#define M 150505
#define rt root
using namespace std;
void bfs(uint u);
struct wyx{
	uint s[2],p,v;
	uint h,size;
	void init(char _v,uint _p){
		p=_p;
		v=_v-'a'+1;
		size=1;
		return;
	}
}tr[N];
uint poww[M];
uint root,idx;
void pushup(uint x){
	tr[x].size=tr[tr[x].s[0]].size+tr[tr[x].s[1]].size+1;
	tr[x].h=tr[tr[x].s[0]].h*(tr[tr[x].s[1]].size+1)
	+tr[x].v*tr[tr[x].s[1]].size+tr[tr[x].s[1]].h;	
	return;
}
void rotate(uint x){
	uint y=tr[x].p,z=tr[y].p;
	uint k=(tr[y].s[1]==x),d=(tr[z].s[1]==y);
	tr[z].s[d]=x,tr[x].p=z;
	tr[y].s[k]=tr[x].s[k^1],tr[tr[x].s[k^1]].p=y;
	tr[x].s[k^1]=y,tr[y].p=x;
	pushup(y),pushup(x);
	return;
}
void splay(uint x,uint k){
	while(tr[x].p!=k){
		bfs(root);
		cout<<endl;
		uint y=tr[x].p,z=tr[y].p;
//		if(y==z) cout<<"NOOO!\n";
		if(z!=k){
			if((tr[y].s[1]==x)^(tr[z].s[1]==y)) rotate(x);
			else rotate(y);
		}
		rotate(x);
	}
	if(!k) root=x;
	return;
}
void find(uint k){
	if(k>tr[rt].size){
		printf("OOPS!!!\n");
		exit(0);
	}
	int x=root;
	while(true){
		int y=tr[x].s[0];
		if(k>tr[y].size+1) k-=tr[y].size+1,x=tr[x].s[1];
		else if(k<=tr[y].size) x=tr[x].s[0];
		else break;
	}
	splay(x,0);
	return;
}
void insert(uint s,char c){
	find(s);
	uint v=c-'a'+1;
	uint x=++idx;
	tr[x].s[1]=tr[root].s[1];
	tr[x].init(v,root);
	splay(x,0);
	return;
}
uint get_hack(uint l,uint r){
	find(r);
	find(l);
	return tr[tr[tr[rt].s[1]].s[0]].h;
}
uint solve(uint x,uint y){
	uint l=0,r=idx-y-1,mid;
	while(l<r){
		mid=(l+r+1)>>1;
		if(get_hack(x,x+mid-1)==get_hack(y,y+mid-1))l=mid;
		else r=mid-1;
	}
	return l;
}
void change(uint s,char c){
	find(s);
	tr[root].v=c-'a'+1;
	pushup(root);
	return;
}
void bfs(uint u){
	if(!u) return;
	printf("%d:",u);
	if(tr[u].s[0]){
		if(u==4&&tr[u].s[0]==1){
			return;
		}
		printf("(0)%d ",tr[u].s[0]);
	}
	if(tr[u].s[1]) printf("(1)%d ",tr[u].s[1]);
	printf("\n");
	for(uint i=1;i<=idx;i++){
		if(tr[i].p!=u&&(i==tr[u].s[0]||i==tr[u].s[1])){
			printf("No%d",i);
			return;
		}
	}
	bfs(tr[u].s[0]),bfs(tr[u].s[1]);
	return;
}
signed main(){
//	ios::sync_with_stdio(false);
//	cin.tie(NULL),cout.tie(NULL);
	poww[0]=1;
	for(ri i=1;i<M;i++){
		poww[i]=poww[i-1]*27;
	}
	string s;
	cin>>s;
	uint x;
	for(ri i=0;i<(int)s.size();i++){
		x=++idx;
		if(!i){
			root=x;
			tr[x].init(s[i],0);
		}
		else{
			tr[x-1].s[1]=x;
			tr[x].init(s[i],x-1);
			splay(x,0);
		}
	}
	uint m,y;
	char op;
	cin>>m;
	while(m--){
		cin>>op;
		if(op=='Q'){
			cin>>x>>y;
			cout<<solve(x,y)<<"\n";
		}else if(op=='R'){
			cin>>x>>op;
			change(x,op);
		}else{
			cin>>x>>op;
			insert(x,op);
		}
	}
	return 0;
}
2024/4/7 20:05
加载中...