P2814 家谱(string + 并查集)

题目: 传送门
思路: 用unordered_map<string, string> pre;保存父节点,就和int pre[];一样,不过这里是用stl的unordered_map自动的hash把字符串变成了整数(unordered_map比map快),然后套模板就行了
Code:

#include<bits/stdc++.h>

typedef long long ll;
using namespace std;

unordered_map<string, string> pre;
string fa, son, tmp;
string find(string s) {
    
    
	if (s == pre[s])  return s;
	return pre[s] = find(pre[s]);
}
void merge() {
    
    
	string ffa = find(fa), fson(son);
	if (ffa != fson)  pre[fson] = ffa;
}
int main()
{
    
    
	
	char op;
	while ((op = getchar()) != '$') {
    
    
		if (op == '#') {
    
    
			cin>>fa;
			if (pre[fa] == "")  pre[fa] = fa;
		} else if (op == '+') {
    
    
			cin>>son;
			merge();
		} else if (op == '?') {
    
    
			cin>>tmp;
			cout<<tmp<<" "<<find(tmp)<<endl;
		}
	}
	
	return 0;
} 

ps:以后找机会自己学着写个hash

猜你喜欢

转载自blog.csdn.net/u010017231/article/details/104853714