测了题目自带的样例和uDebug上的数据,都通过了。 但就是WA啊啊。 求大佬赐hack 数据。
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
multimap<string,int> words;//每篇文章的小写单词map行号(一个单词可对应多个行号)
map<int,multimap<string,int>> docs_words;//每篇文章编号对应的words表
vector<string> documents;//按行存原文章
map<int,vector<string>> documents_No;//原文章map编号
set<int> rst;
int n;
void INPUT(int s){
char line[90];
documents.clear();
words.clear();
int rows=0;
while(1){
memset(line,0,sizeof(line));
cin.getline(line,90);
if(!strcmp(line,"**********")){
documents_No[s]=documents;
docs_words[s]=words;
return;
}
documents.push_back(line);
for(int i=0;i<strlen(line);++i){
if(isalpha(line[i])) line[i]=tolower(line[i]);
else(line[i]=' ');
}
stringstream ss;
ss<<line;
string word;
while(ss>>word){
words.insert({word,rows});
}
++rows;
}
}
bool search(int a, string s){//a是文章编号
if (docs_words[a].count(s)){
auto it=docs_words[a].find(s);
for(int i=0;i<docs_words[a].count(s);++i){
rst.insert((*it).second);
++it;
}
}
return docs_words[a].count(s);
}
void OUTPUT(int a){//a是文章编号
for(auto it=rst.begin();it!=rst.end();++it){
cout<<documents_No[a][*it]<<endl;
}
}
void FIND_WORD(string s){
int flag=0;
int first=0;
for(int i=0;i<n;++i){
rst.clear();//保存需要输出的行号
if(search(i,s)){
if(first) cout<<"----------"<<endl;
OUTPUT(i);
first=1;
flag=1;
}
}
if (!flag) cout<<"Sorry, I found nothing."<<endl;
cout<<"=========="<<endl;
}
void AND(string a, string b){
int flag=0;
int first=0;
for(int i=0;i<n;++i){
rst.clear();//保存需要输出的行号
if(search(i,a)&&search(i,b)){
if(first) cout<<"----------"<<endl;
OUTPUT(i);
first=1;
flag=1;
}
}
if (!flag) cout<<"Sorry, I found nothing."<<endl;
cout<<"=========="<<endl;
}
void OR(string a, string b){
int flag=0;
int first=0;
for(int i=0;i<n;++i){
rst.clear();//保存需要输出的行号
if(search(i,a)||search(i,b)){
if(first) cout<<"----------"<<endl;
OUTPUT(i);
first=1;
flag=1;
}
}
if (!flag) cout<<"Sorry, I found nothing."<<endl;
cout<<"=========="<<endl;
}
void NOT(string s){
stringstream ss;string a;
ss<<s;
ss>>a>>a;
int flag=0;
int first=0;
for(int i=0;i<n;++i){
rst.clear();//保存需要输出的行号
if(!search(i,a)){
if(first) cout<<"----------"<<endl;
for(int j=0;j<documents_No[i].size();++j){
rst.insert(j);
}
OUTPUT(i);
first=1;
flag=1;
}
}
if (!flag) cout<<"Sorry, I found nothing."<<endl;
cout<<"=========="<<endl;
}
int main()
{
#ifdef LOCAL
freopen("D:\\life\\学习\\编程\\C++\\算法竞赛入门经典\\5\\data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif
//输入文章
int m;
scanf("%d ", &n);
for(int i=0;i<n;++i){
INPUT(i);
}
//输入指令
scanf("%d ", &m);
for(int i=0;i<m;++i){
char s[90];
cin.getline(s,90);
string commd=s;
if(commd[0]=='N')NOT(commd);
else if((int)commd.find(' ')==-1) FIND_WORD(commd);
else{
stringstream ss;
string a,b,c;
ss<<commd;
ss>>a>>b>>c;
if(b[0]=='A') AND(a,c);
else OR(a,c);
}
}
return 0;
}