#include #include #include #include #include #define foreach(T,p,c) for(T p = (c).begin(); p != (c).end(); p++) #define UNKNOWN (-1) #define NO (0) #define YES (1) using namespace std; struct street_t { string name; set P, C, S; // parents, children, sibling int flag; }; typedef map streets_t; void get_street(string &s0, string &s1) { string s; cin >> s; int p = s.find("-"); s0 = s.substr(0, p); s1 = s.substr(p + 1); } int main(void) { int n; while(cin >> n) { if(n == 0) break; streets_t streets; for(int i = 0; i < n; i++) { string s0, s1; get_street(s0, s1); streets[s0].name = s0; streets[s1].name = s1; streets[s0].P.insert(s1); streets[s1].C.insert(s0); } foreach(streets_t::iterator, p, streets) { street_t *p0 = &(p->second); foreach(set::iterator, q, p0->P) { street_t *p1 = &(streets[*q]); foreach(set::iterator, r, p1->C) { street_t *p2 = &(streets[*r]); p0->S.insert(p2->name); p2->S.insert(p0->name); } } foreach(set::iterator, q, p0->C) { street_t *p1 = &(streets[*q]); foreach(set::iterator, r, p1->P) { street_t *p2 = &(streets[*r]); p0->S.insert(p2->name); p2->S.insert(p0->name); } } } foreach(streets_t::iterator, p, streets) { street_t *p0 = &(p->second); foreach(set::iterator, q, p0->P) { street_t *p1 = &(streets[*q]); foreach(set::iterator, r, p1->P) { street_t *p2 = &(streets[*r]); p0->S.erase(p2->name); p2->S.erase(p0->name); } } } cout << streets.size() << endl; int m; cin >> m; for(int i = 0; i < m; i++) { string s0, s1; get_street(s0, s1); foreach(streets_t::iterator, p, streets) { p->second.flag = UNKNOWN; } queue q; streets[s0].flag = NO; q.push(s0); int flag = NO; while(!q.empty()) { string s = q.front(); q.pop(); if(s == s1) { flag = streets[s1].flag; break; } foreach(set::iterator, p, streets[s].P) { if(streets[*p].flag == UNKNOWN) { q.push(*p); streets[*p].flag = 1 - streets[s].flag; } } foreach(set::iterator, p, streets[s].S) { if(streets[*p].flag == UNKNOWN) { q.push(*p); streets[*p].flag = streets[s].flag; } } } cout << (flag ? "YES" : "NO") << endl; } } return 0; }