题解 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}\)

浙公网安备 33010602011771号