#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 ****************************************************************/