求助万能的谷民!!!
调不出样例,一直循环。。。
请大牛帮忙调下 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;
}