本题是否可以分块
查看原帖
本题是否可以分块
555287
_ANIG_楼主2022/10/27 20:03

能不能用类似未来日记的方法,用并查集和分块。但是我的代码一直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);
}
2022/10/27 20:03
加载中...