//GNC #include #include #include #include #include #include #include #include using namespace std; void parse(vector & vs,string &s){ string t; bool space = false; for(int i = 0 ; i < s.size() ; i ++){ if(s[i] == ' '){ if(!space){ if(t != "") { vs.push_back(t); } t = ""; space = true; t += ' '; }else{ t += ' '; } }else{ if(!space){ t += s[i]; }else{ space = false; if(t != "" && t != " ") vs.push_back(t); t = ""; t += s[i]; } } } if(t!= "" && t != " ") vs.push_back(t); } typedef pair bi; typedef pair tri; const int NN = 100050; char buf[NN]; void chomp(char *szT) { int l = strlen(szT); if(isspace(szT[l-1])) szT[l-1] = '\0'; } int main(void){ FILE *fp = fopen("english.in", "rt"); setvbuf(fp, 0, _IOFBF, 4096); string dummy; int ncase = 1; while(fscanf(fp, "%s ", buf) == 1){ if(ncase != 1) cout << endl; string s; int counter = 0; map > inverted; map > triinverted; string totaldoc; bool firstline = true; while(fgets(buf, NN, fp)){ chomp(buf); if(strcmp(buf, "%%%%%") == 0) break; if(!firstline) totaldoc += ' '; firstline = false; totaldoc += buf; } vector vs; parse(vs, totaldoc); // cout << "doc i" << endl; for(int i = 0; i < vs.size(); ++i){ inverted[vs[i]].push_back(i); if(i > 1) triinverted[make_pair(vs[i-2],bi(vs[i-1],vs[i]))].push_back(i-2); } // cout << "doc f " << endl; vector queries; while(fgets(buf, NN, fp)){ chomp(buf); s = buf; if(s == "%%%%%") break; queries.push_back(s); } cout << "Case " << ncase << ":" << endl; ncase ++; for(int i = 0 ; i < queries.size() ; i ++){ vector query; // cout << "Q" << queries[i] << endl; parse(query, queries[i]); // cout << "parsed" << query.size() << endl; vector res(inverted[query[0]].begin(), inverted[query[0]].end()); int hop = 1; for(int j = 1; j < query.size(); ++j){ // cout << "J" << j << endl; vector next; vector *inv; if(query.size()-j >= 3){ inv = &triinverted[make_pair(query[j],bi(query[j+1],query[j+2]))]; for(int k = 0; k < res.size(); ++k){ res[k]+=hop; } hop = 3; j+=2; }else{ inv = &inverted[query[j]]; for(int k = 0; k < res.size(); ++k){ res[k]+=hop; } hop = 1; } set_intersection(res.begin(), res.end(), inv->begin(), inv->end(), back_inserter(next)); res.swap(next); if ( res.size()==0 ) break; } cout << res.size() << endl; } } fclose(fp); return 0; }