#include #include #include #include #include #include #include #include using namespace std; int main(void) { int n; while(cin >> n){ map > stronger; map > weaker; map > neighbour; set roads; set::iterator rit1,rit2,rit3; map > equiv; if(n==0) break; for(int i = 0 ; i < n ; i ++){ string s; cin >> s; size_t place; place = s.find('-'); string s1 = s.substr(0,place); string s2 = s.substr(place+1,s.size()); //cout << s1 << " " << s2 << endl; stronger[s1].insert(s2); weaker[s2].insert(s1); roads.insert(s1);roads.insert(s2); neighbour[s1].insert(s2);neighbour[s2].insert(s1); } for(rit1 = roads.begin() ; rit1 != roads.end() ; rit1++){ for(rit2 = roads.begin() ; rit2 != roads.end() ; rit2++){ set intersect; set_intersection(neighbour[*rit1].begin(),neighbour[*rit1].end(),neighbour[*rit2].begin(),neighbour[*rit2].end(),inserter(intersect,intersect.begin())); intersect.erase(*rit1);intersect.erase(*rit2); if(intersect.size() == 0) continue; intersect.clear(); set_intersection(stronger[*rit1].begin(),stronger[*rit1].end(),weaker[*rit2].begin(),weaker[*rit2].end(),inserter(intersect,intersect.begin())); if(intersect.size() != 0) continue; intersect.clear(); set_intersection(stronger[*rit2].begin(),stronger[*rit2].end(),weaker[*rit1].begin(),weaker[*rit1].end(),inserter(intersect,intersect.begin())); if(intersect.size() != 0) continue; equiv[*rit1].insert(*rit2); equiv[*rit2].insert(*rit1); } } //cout << "ultraenter"<< endl; map > datareservoir; for(rit1 = roads.begin() ; rit1 != roads.end() ; rit1++){ map ultra; for(rit2 = roads.begin() ; rit2 != roads.end() ; rit2++){ ultra[*rit2] = 9999; } ultra[*rit1] = 0; deque ultraqueue; ultraqueue.push_back(*rit1); while(ultraqueue.size() != 0){ string rs = ultraqueue.front(); ultraqueue.pop_front(); for(rit3 = stronger[rs].begin() ; rit3 != stronger[rs].end();rit3++){ int t = ultra[*rit3]; ultra[*rit3] = min(ultra[*rit3],ultra[rs]+1); if(ultra[*rit3] != t) ultraqueue.push_back(*rit3); } for(rit3 = equiv[rs].begin() ; rit3 != equiv[rs].end();rit3++){ int t = ultra[*rit3]; ultra[*rit3] = min(ultra[*rit3],ultra[rs]+2); if(ultra[*rit3] != t) ultraqueue.push_back(*rit3); } } datareservoir[*rit1] = ultra; //cout << "reservoirenter"<< endl; } int m; cin >> m; cout << roads.size() << endl; for(int i = 0 ; i < m ; i ++){ string s; cin >> s; size_t place; place = s.find('-'); string s1 = s.substr(0,place); string s2 = s.substr(place+1,s.size()); if((datareservoir[s1][s2]%2) == 1 && datareservoir[s1][s2]!=9999){ cout << "YES" << endl; }else{ cout << "NO" << endl; } } } }