由于输入中有符号来区分父子和询问,所以先单独输入一个字符,再进行名字的读入,f[name]的含义是该name的父亲是谁,最高层则是自己,由此组建一个并查集的数据结构。
以下为ac代码
#include <bits/stdc++.h>
using namespace std;
int n, m, k;
map<string, string> f;
string find(string x)
{ // 路径压缩的查询方法
if (f[x] == x)
return x;
else
return f[x] = find(f[x]); // 压缩操作
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
string name, fa;
char ch;
cin >> ch;
while (ch != '$')
{
cin >> name;
if (ch == '#')
{
fa = name;
if (f[name] == "")
f[name] = name;
}
else if (ch == '+')
f[name] = fa;
else
cout << name << ' ' << find(name) << '\n';
cin >> ch;
}
return 0;
}