#include <bits/stdc++.h>
using namespace std;
struct FHQ_Treap
{
int lc,rc,siz,key;
char col,tag1,tag2;
}tree[100005];
string s;
int T;
int root,idx;
int new_node(char col)
{
tree[++idx]={0,0,1,rand(),col,'#','#'};
return idx;
}
void push_up(int id)
{
tree[id].siz=tree[tree[id].lc].siz+tree[tree[id].rc].siz+1;
}
void push_down(int id)
{
if(tree[id].tag1=='#')
return;
tree[tree[id].lc].tag1=tree[tree[id].rc].tag1=tree[id].tag1;
tree[tree[id].lc].tag2=tree[tree[id].rc].tag2=tree[id].tag2;
if(tree[tree[id].lc].col==tree[id].tag1)
tree[tree[id].lc].col=tree[id].tag2;
if(tree[tree[id].rc].col==tree[id].tag1)
tree[tree[id].rc].col=tree[id].tag2;
tree[id].tag1=tree[id].tag2='#';
}
void split(int id,int rnk,int &x,int &y)
{
if(!id)
{
x=y=0;
return;
}
push_down(id);
if(tree[tree[id].lc].siz+1<=rnk)
{
x=id;
split(tree[id].rc,rnk-tree[tree[id].lc].siz-1,tree[id].rc,y);
}
else
{
y=id;
split(tree[id].lc,rnk,x,tree[id].lc);
}
push_up(id);
}
int merge(int x,int y)
{
if(!x||!y)
return x+y;
if(tree[x].key>tree[y].key)
{
push_down(x);
tree[x].rc=merge(tree[x].rc,y);
push_up(x);
return x;
}
else
{
push_down(y);
tree[y].lc=merge(x,tree[y].lc);
push_up(y);
return y;
}
}
void Update(int l,int r,int col1,int col2)
{
int rx,ry,rz;
split(root,r,rx,rz);
split(rx,l-1,rx,ry);
tree[ry].tag1=col1;
tree[ry].tag2=col2;
if(tree[ry].col==col1)
tree[ry].col=col2;
root=merge(merge(rx,ry),rz);
}
void DFS(int id)
{
push_down(id);
if(tree[id].lc)
DFS(tree[id].lc);
cout<<tree[id].col;
if(tree[id].rc)
DFS(tree[id].rc);
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
srand(time(0));
cin>>s;
for(int i=0;i<s.size();i++)
root=merge(root,new_node(s[i]));
cin>>T;
while(T--)
{
int l,r;
char c1,c2;
cin>>l>>r>>c1>>c2;
Update(l,r,c1,c2);
}
DFS(root);
return 0;
}
这个做法应该是我想假了,但是不知道到底错在哪里,有大佬能指出假在哪里吗,或者给个hack数据也行。谢谢