Code:
#include<bits/stdc++.h>
using namespace std;
namespace UFS{int fa[50005];inline void set(int n){for(int i=1;i<=n;i++){fa[i]=i;}return;}int find(int x){if(fa[x]==x){return x;}fa[x]=find(fa[x]);return find(fa[x]);}inline void merge(int i,int j){fa[find(i)]=find(j);return;}}
int n;
char c;
string s,name[50005];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int j,x,y;
UFS::set(50000);
while(c^'$')
{
if(c=='#')
{
cin>>s;
for(j=1;j<=n;j++)
{
if(name[j]==s)
{
break;
}
}
if(j>n)
{
name[++n]=s;
}
x=j;
cin>>c;
while(c=='+')
{
cin>>s;
for(j=1;j<=n;j++)
{
if(name[j]==s)
{
break;
}
}
if(j>n)
{
n++;
name[n]=s;
}
y=j;
UFS::merge(y,x);
cin>>c;
}
}
else if(c=='?')
{
cin>>s;
cout<<s<<' ';
for(j=1;j<=n;j++)
{
if(name[j]==s)
{
break;
}
}
cout<<name[UFS::find(j)]<<endl;
}
cin>>c;
}
return 0;
}