在ZOJ 上可以ac,但在UVA上面就老过不去,不知为何。
//双亲表示法存储这棵树。
#include<iostream>
#include<string>
#include<map>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn=2110;
int parent[maxn];
int layer[maxn];
int num;
map<string,int> mhash;
void init()
{
memset(layer,-1,sizeof(layer));
memset(parent,-1,sizeof(parent));
num=0;
mhash.clear();
}
void solve(int i)
{
string s1;
getline(cin,s1);
int tmp=s1.find_last_of(' ')-s1.find_first_of(' ')+1;
if(i)
s1.erase(0,tmp);
mhash[s1]=num++;
layer[num-1]=tmp;
if(i==0)
layer[num-1]=0;
int pos=num-2;
while(layer[num-1]<=layer[pos]&&pos>=0)
pos--;
parent[num-1]=pos;
}
bool judge(string s1,string s2,string s3)
{
int n1=mhash[s1];
int n2=mhash[s2];
if(s3=="child")
return parent[n1]==n2?1:0;
else if(s3=="parent")
return parent[n2]==n1?1:0;
else if(s3=="sibling")
return parent[n1]==parent[n2]?1:0;
else if(s3=="descendant")
{
while(n1>=0)
{
n1=parent[n1];
if(n1==n2)
{
return 1;
}
}
return 0;
}
else
{
while(n2>=0)
{
n2=parent[n2];
if(n1==n2)
return 1;
}
return 0;
}
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF&&(n||m))
{
getchar();
init();
for(int i=0;i<n;i++)
solve(i);
string s1,s2,s3;
for(int i=0;i<m;i++)
{
cin>>s1;
cin>>s3>>s3>>s3;
cin>>s2>>s2;
s2.erase(s2.end()-1);
if(judge(s1,s2,s3))
cout<<"True\n";
else
cout<<"False\n";
}
cout<<"\n";
}
return 0;
}