mxqz,为什么过不了编
查看原帖
mxqz,为什么过不了编
477757
V1mnkE楼主2023/1/7 19:48

rt

#include<iostream>
using namespace std;
string s;
int m;
struct data{
	char p[26];
	string ss;
}t[40000005];
void pushup(int o){
	t[o].ss=t[o<<1].ss+t[o<<1|1].ss;
}
void build(int o,int l,int r){
	for(int i=0;i<26;i++)t[o].p[i]=i;
	if(l==r){
		t[o].ss=t[o].ss+s[l-1];
		return ;
	}
	int mid=l+r>>1;
	build(o<<1,l,mid);
	build(o<<1|1,mid+1,r);
	pushup(o);
}
void pushdown(int o){
	for(int i=0;i<t[o].ss.size();i++){
		t[o].ss[i]=t[o].p[t[o].ss[i]-'a']+'a';
	}
	for(int i=0;i<26;i++){
		t[o<<1].p[i]=t[o].p[t[o<<1].p[i]];
		t[o<<1|1].p[i]=t[o].p[t[o<<1|1].p[i]];
	}
	for(int i=0;i<26;i++)t[o].p[i]=i;
	return ;
}
void update(int o,int l,int r,int x,int y,int ql,int qr){
	if(l>=ql&&r<=qr){
		t[o].p[x]=y;
		return ;
	}
	pushdown(o);
	int mid=l+r>>1;
	if(ql<=mid)update(o<<1,l,mid,x,y,ql,qr);
	if(qr>mid)update(o<<1|1,mid+1,r,x,y,ql,qr);
}
void up1(int o,int l,int r){
	if(l==r){
		t[o].ss[0]=t[o].p[t[o].ss[0]-'a']+'a';
		return ;
	}
	int mid=l+r>>1;
	up1(o<<1,l,mid);
	up1(o<<1|1,mid+1,r);
	pushup(o);
	for(int i=0;i<t[o].ss.size();i++){
		t[o].ss[i]=t[o].p[t[o].ss[i]-'a']+'a';
	}
	return ;
}
int main(){
	cin>>s>>m;
	int n=s.size();
	build(1,1,s.size());
	while(m--){
		int l,r;
		char x,y;
		cin>>l>>r>>x>>y;
		update(1,1,n,x-'a',y-'a',l,r);
	}
	up1(1,1,n);
	pushdown(1);
	cout<<t[1].ss;
}
2023/1/7 19:48
加载中...