最后两个点TLE
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct node {
string name;
int fa;
};
node a[50009];
int find(int i) {
if (a[i].fa != i)
a[i].fa = find(a[i].fa);
return a[i].fa;
}
void merge(int r, int t) {
int q = find(t);
if (r != q)
a[q].fa = r;
}
int main() {
char c;
int tot = 0;
int fa;
string s;
do {
cin >> c;
if (c == '$')
break;
cin >> s;
int r = -1;
for (int i = 1; i <= tot; i++)
if (a[i].name == s) {
r = i;
break;
}
if (r == -1) {
r = ++tot;
a[r].fa = r;
a[r].name = s;
}
if (c == '#') {
fa = a[r].fa;
continue;
}
if (c == '+') {
merge(fa, r);
continue;
}
if (c == '?')
cout << s << " " << a[find(r)].name << endl;
} while (1);
return 0;
}