#include #include #include using namespace std; const int INF=9999; vector > g_edge; vector g_dic; vector > g_mat; int GetIndex(string str,bool flg=false) { int i; for(i = 0 ; i < (int)g_dic.size() ; i++) if(g_dic[i] == str)break; if(flg && i == (int)g_dic.size())g_dic.push_back(str); return i; } void Add(string& buf) { int a=GetIndex(string(buf,0,buf.find('-')),true); int b=GetIndex(string(buf,buf.find('-')+1),true); g_edge.push_back(make_pair(a,b)); } void MakeMat() { int n=g_edge.size(),i,j,a,b,c,d; g_mat.assign(g_dic.size(),vector (g_dic.size(),INF)); for(i = 0 ; i < n ; i++) { a = g_edge[i].first; b = g_edge[i].second; g_mat[a][b] = 1; for(j = i+1 ; j < n ; j++) { c = g_edge[j].first; d = g_edge[j].second; if(a == c)g_mat[b][d] = g_mat[d][b] = 0; if(b == d)g_mat[a][c] = g_mat[c][a] = 0; } } for(i = 0 ; i < n ; i++) { a = g_edge[i].first; b = g_edge[i].second; for(j = i+1 ; j < n ; j++) { c = g_edge[j].first; d = g_edge[j].second; if(b == c)g_mat[a][d] = g_mat[d][a] = INF; if(a == d)g_mat[b][c] = g_mat[c][b] = INF; } } } void FloydWarshall() { int n = g_dic.size(); for(int i = 0 ; i < n ;i++) for(int j = 0 ; j < n ;j++) for(int k = 0 ; k < n ; k++) if(g_mat[j][i]+g_mat[i][k] < g_mat[j][k]) g_mat[j][k] = g_mat[j][i] + g_mat[i][k]; } bool IsValid(int a,int b) { int n= g_dic.size(); return a < n && b < n && g_mat[a][b] != INF && (g_mat[a][b]&1); } int main() { int n,m; string buf; while(cin >> n , n) { g_dic.clear(); g_mat.clear(); g_edge.clear(); while(n--) { cin >> buf; Add(buf); } MakeMat(); FloydWarshall(); cout << g_dic.size() << endl; cin >> m; while(m--) { cin >> buf; if(IsValid(GetIndex(string(buf,0,buf.find('-'))), GetIndex(string(buf,buf.find('-')+1)))) cout << "YES" << endl; else cout << "NO" << endl; } } return 0; }