#include <bits/stdc++.h>
using namespace std;
struct FHQ_Treap
{
int lc,rc,siz,key,col,tag[26];
}tree[100005];
string s;
int T;
int root,idx;
int new_node(int col)
{
++idx;
tree[idx].lc=tree[idx].rc=0;
tree[idx].siz=1;
tree[idx].key=rand();
tree[idx].col=col;
for(int i=0;i<26;i++)
tree[idx].tag[i]=-1;
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].tag[tree[tree[id].lc].col]!=-1)
tree[tree[id].lc].col=tree[id].tag[tree[tree[id].lc].col];
if(tree[id].tag[tree[tree[id].rc].col]!=-1)
tree[tree[id].rc].col=tree[id].tag[tree[tree[id].rc].col];
for(int i=0;i<26;i++)
{
if(tree[id].tag[i]==-1)
continue;
tree[tree[id].lc].tag[i]=tree[tree[id].rc].tag[i]=tree[id].tag[i];
tree[id].tag[i]=-1;
}
}
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].tag[col1]=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<<char(tree[id].col+'a');
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]-'a'));
cin>>T;
while(T--)
{
int l,r;
char c1,c2;
cin>>l>>r>>c1>>c2;
Update(l,r,c1-'a',c2-'a');
}
DFS(root);
return 0;
}
应该是我想假了,但不知道错在哪里。有大佬能指出错在哪里,或给一份hack数据吗?谢谢