#include<iostream>#include<cstring>#include<cstdio>using namespace std;int child[30];//表示孩子的数目int find(int x , int y){ int res = -1;//用来记录一共多少代 while(child[x] != -1) { if(child[x] == y) { break;//他们是父子关系找到了,循环结束 } x = child[x]; res++;// } //这里是用循环进行求解的 也可以用递归进行求解,不过就是会麻烦一些 //经过上面的循环,一定会出现两种结果要么找到他们之间有关系,要么么他们之间没有任何关系 if(child[x]== y) { return res; } else { return -1; }}int main(){ //下面是主函数的输入和输出 //这里主要是对字符串的处理和初始换函数 int m , n; while(cin>>m>>n) { char buf[5] ; if(m == 0 && n == 0) return 0; memset(child, -1, sizeof(child)); for(int i = 0 ; i < m ; i++) { //下面开始进行初始化 scanf("%s", buf); int tmp = buf[0] -'A'; if(buf[1] !='-') {//将符号转换为整数 int tmp1 = buf[1] -'A'; child[tmp1] = tmp; } if(buf[2] != '-') { int tmp2 = buf[2] -'A'; child[tmp2] = tmp; } } for(int j = 0 ; j < n ;j++) { scanf("%s", buf); int tmp3 = buf[0] - 'A'; int tmp4 = buf[1] - 'A'; int ans1 = find(tmp3, tmp4);//表示的是tmp3 和tmp4 的关系还有一种情况是tmp4和tmp3关系 int ans2 = find(tmp4, tmp3); if(ans1 == -1 && ans2 == -1) { printf("-\n"); } else if(ans1 != -1) {//这里需要表你如果他们之间没有关系 //如果ans1为正的, tmp3 是祖先 switch(ans1) {//只有那么几种关系 parent great-grandparent case 0: printf("parent\n"); break; default: for(int k = 0 ; k < ans1; k++) { printf("great-"); } printf("grandparent\n"); break; } } else if (ans2 != -1) { switch(ans2) {//因为是从-1 开始的,因此+1 那么就是0了 case 0: printf("child\n"); break; default: for(int k = 0 ; k < ans2; k++) { printf("great-"); } printf("grandchild\n"); break; } } } } return 0;}