#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
#define NMAX 50002
struct tagPerson
{
char m_name[7];
int m_father;
} Person[NMAX];
int g_nPeople = 0;
void InitData();
int FindAncestor(const char szName[]);
int AddPerson(const char szName[]);
int CheckPerson(const char szName[]);
int main()
{
InitData();
return 0;
}
void InitData()
{
char szName[8] = "\0";
int nFather = 0;
char chFlag = '\0';
cin >>szName;
chFlag = szName[0];
while (chFlag != '$')
{
if (chFlag == '#')
{
nFather = FindAncestor(szName + 1);
cin >>szName;
chFlag = szName[0];
while (chFlag == '+')
{
int father = CheckPerson(szName + 1);
if (father == -1)
{
father = AddPerson(szName + 1);
}
Person[father].m_father = nFather;
cin >>szName;
chFlag = szName[0];
}
}
if (chFlag == '?')
{
nFather = FindAncestor(szName + 1);
cout <<szName+1 <<' ' <<Person[nFather].m_name <<endl;
cin >>szName;
chFlag = szName[0];
}
}
}
int FindAncestor(const char szName[])
{
int nFather = CheckPerson(szName);
if (nFather == -1)
{
nFather = AddPerson(szName);
}
else
{
while (Person[nFather].m_father != nFather)
{
nFather = Person[nFather].m_father;
}
}
return nFather;
}
int AddPerson(const char szName[])
{
Person[g_nPeople].m_father = g_nPeople;
strcpy(Person[g_nPeople].m_name, szName);
++g_nPeople;
return g_nPeople - 1;
}
int CheckPerson(const char szName[])
{
for (int i = 0; i < g_nPeople; ++i)
{
if (strcmp(szName, Person[i].m_name) == 0)
{
return i;
}
}
return -1;
}
/**************************************************************
Problem: 2236
User: admin
Language: C++
Result: Accepted
Time:676 ms
Memory:2664 kb
****************************************************************/