能不能用类似未来日记的方法,用并查集和分块。但是我的代码一直MLE,不知道为什么。
#include <bits/stdc++.h>
using namespace std;
const int T=500,N=205;
int fa[1000005],p[1000005],fr[N+5][46],bh[1000005],st[N+5],ed[N+5],n,m;
int f(int x){
if(fa[x]==x)return x;
return fa[x]=f(fa[x]);
}
void init(){
for(int i=1;i<=100000;i++)bh[i]=(i-1)/T+1;
for(int i=1;i<N;i++)st[i]=(i-1)*T+1,ed[i]=i*T;
for(int i=1;i<=n;i++)fa[i]=i;
for(int i=1;i<=n;i++)if(fr[bh[i]][p[i]])fa[i]=fr[bh[i]][p[i]];else fr[bh[i]][p[i]]=i,fa[i]=i;
}
void rst(int l,int r,int x,int y){
int u=bh[l];
for(int i=st[u];i<=ed[u]&&i<=n;i++)p[i]=p[f(i)];
for(int i=l;i<=r;i++)if(p[i]==x)p[i]=y;
fr[u][x]=fr[u][y]=0;
for(int i=st[u];i<=ed[u];i++){
if(i>n)break;
if(p[i]==x)if(fr[u][x])fa[i]=fr[u][x];else fr[u][x]=i,fa[i]=i;
if(p[i]==y)if(fr[u][y])fa[i]=fr[u][y];else fr[u][y]=i,fa[i]=i;
}
}
void sets(int l,int r,int x,int y){
if(x==y)return;
if(bh[l]==bh[r]){rst(l,r,x,y);return;}
int ll=bh[l]+1,rr=bh[r]-1;
for(int i=ll;i<=rr;i++)if(fr[i][x]){
if(fr[i][y])fa[fr[i][x]]=fr[i][y];
else p[fr[i][x]]=y,fr[i][y]=fr[i][x],fr[i][x]=0;
}
rst(l,st[ll]-1,x,y);rst(ed[rr]+1,r,x,y);
}
string s;
int main(){
cin>>s>>m;
n=s.size();
for(int i=1;i<=n;i++)p[i]=s[i-1]-'a'+1;
init();
while(m--){
int a,b;
char x,y;
cin>>a>>b>>x>>y;
sets(a,b,x-'a'+1,y-'a'+1);
}
for(int i=1;i<=n;i++)cout<<(char)(p[f(i)]+'a'-1);
}