题解 SP28 【HMRO - Help the Military Recruitment Office!】

题目分析

根据题目描述,要输出的值是指定的识别号码与其的 \(MRO\) 码,开始时识别号码和 \(MRO\) 码都给出,之后将部分的 \(MRO\) 码替换成为另外一种 \(MRO\) 码,所以就可以想到以识别号码为下标,指向 \(MRO\) 码,然后用并查集完成 \(MRO\) 之间的替换就好了。


代码实现

这道题我开了两个数组

map<long long,int> mp;
map<string,string> fa;

都是 \(map\),有可能有人不知道 \(map\) 的用法,这里简述下,第一个类型相当于这个类型的下标,第二个类型是其存储的东西。

所以 \(mp\) 数组就代表下标为 \(long\) \(long\)\(int\) 类型数组,做到识别号码与 \(MRO\) 码之间的连接。

\(fa\) 数组就是一个 \(srting\) 类型的并查集了。借助这两个数组可以做到将时间大大地优化下来 (当然你也可以写二分)

上代码

#include<bits/stdc++.h>
using namespace std;

const int maxn = 100005;

struct reader{
	template<typename Type>
	reader&operator>>(Type&ret){
		int f=1; ret=0; char ch=getchar();
		for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
		for(; isdigit(ch);ch=getchar()) ret=(ret<<1)+(ret<<3)+(ch-'0');
		ret*=f; return *this;
	}//读入优化,模板妙啊
}fin;

int T;
int N;
long long x;
string s[maxn],a,b;
map<long long,int> mp;
map<string,string> fa;

string getfa(string x){return x==fa[x]?x:fa[x]=getfa(fa[x]);}

int main(){
//	freopen("SP28.in","r",stdin);
//	freopen("SP28.out","w",stdout);
	fin>>T;
	while(T--){
		fin>>N; mp.clear(); fa.clear();//初始化两个map
		for(int i=1;i<=N;i++){
			fin>>x; cin>>s[i];
			mp[x]=i; fa[s[i]]=s[i];//map的应用
		}
		fin>>N;
		while(N--) cin>>a>>b, fa[getfa(a)]=getfa(b);
		fin>>N;
		while(N--){
			fin>>x;
			cout<<x<<' '<<getfa(s[mp[x]])<<endl;
		}
		if(T)putchar(10);
	}
	return 0;
}

Made By \(\operatorname{wheneveright}\)

posted @ 2021-04-12 19:05  XJ21  阅读(80)  评论(0)    收藏  举报