#include #include #include #include #include #include #include #include #include #include using namespace std; ifstream fin("D.txt"); #define cin fin inline bool has( map& mp, const string& s) { return mp.count(s); } bool dir( map& mp, const string& s) { assert(has(mp, s)); return mp[s]; } void add( map& exists, const string& s ) { size_t i=0; do { size_t j = s.find('/', i); j = (j==string::npos ? s.size() : j+1); string prefix = s.substr(0, j); exists[prefix] = (j != 0 && prefix[j - 1] == '/'); i = j; } while( i != s.size() ); } bool normalize( map& exists, const string& s, string& sn ) { sn = ""; vector prefix; // cout << "hoge " << s << endl; size_t i=0; do { size_t j = s.find('/', i); j = (j==string::npos ? s.size() : j+1); //[i,j) string pr = s.substr(0,j); string seg = s.substr(i,j-i); if( seg == ".." || seg == "../" ) { if(prefix.empty()) return false; prefix.pop_back(); if(prefix.empty()) return false; sn = prefix.back(); } else if( seg == "." || seg == "./" ) {} else { sn += seg; //cout << "###" << sn << endl; if( has(exists, sn + '/') ) sn += '/'; else if( !has(exists, sn) ) return false; prefix.push_back(sn); } i = j; } while( i < s.size() ); return true; } string solve( map& exists, const string& s1, const string& s2 ) { string sn1, sn2; if( !normalize(exists,s1,sn1) || !normalize(exists,s2,sn2) ) return "not found"; if( sn1.size()>0 && sn1[sn1.size()-1]=='/' ) sn1 += "index.html"; if( sn2.size()>0 && sn2[sn2.size()-1]=='/' ) sn2 += "index.html"; if( !has(exists,sn1) || !has(exists,sn2) ) return "not found"; return sn1==sn2 ? "yes" : "no"; } int main() { if(!fin) return -1; int N, M; while( cin>>N>>M, N||M ) { map exists; while(N--) { string s; cin >> s; add( exists, s ); } while(M--) { string s1, s2; cin >> s1 >> s2; cout << solve( exists, s1, s2 ) << endl; } } return 0; }