#include<iostream>
#include<string>
#include<map>
using namespace std;
map<string, int> mp;
map<int, string> mp2;
int s[50004];
void init() {
for (int i = 1; i <= 50003; i++) {
s[i] = i;
}
}
int find_set(int x) {
if (x != s[x]) {
s[x] = find_set(s[x]);
}
return s[x];
}
int main() {
init();
char type;
string father;
string name;
int fatherid;
int ge = 0;
while (type=getchar()) {
if (type == '\n') type = getchar();
if (type == '$') break;
cin >> name;
if (type == '#') {
father = name;
if (!mp.count(name)) {
ge++;
mp[name] = ge;
mp2[ge] = name;
}
fatherid = mp[name];
}
if (type == '+') {
if (!mp.count(name)) {
ge++;
mp[name] = ge;
mp2[ge] = name;
}
int kid = mp[name];
int rf = find_set(fatherid);
int rk = find_set(kid);//每个孩子只有一个父亲,所有kid一定是根节点
if (rf != rk) {
s[rk] = rf;
}
}
if (type == '?') {
int ans = find_set(mp[name]);
cout << name << " " << mp2[ans] << endl;
}
}
return 0;
}
这个是我代码,虽然我知道效率比较低,但也不至于全部超时,测试点1的测试内容就是样例,我在在线idle上得到的运行时间是22ms,但提交代码上去就直接超时了,希望有大佬能够指出为什么会超时,非常感谢