2:倒排索引查询
-
总时间限制:
- 1000ms 内存限制:
- 131072kB
-
描述
-
现在已经对一些文档求出了倒排索引,对于一些词得出了这些词在哪些文档中出现。
要求对于倒排索引实现一些简单的查询,即查询某些词同时出现,或者有些词出现有些词不出现的文档有哪些。
输入
-
第一行包含一个数N,1 <= N <= 1000,表示倒排索引表的数目。
接下来N行,每行第一个数c i,表示这个词出现在了多少个文档中。接下来跟着c i个数,表示出现在的文档编号,编号不一定有序。1 <= c i <= 1000,文档编号为32位整数。
接下来一行包含一个数M,1 <= M <= 100,表示查询的数目。
接下来M行每行N个数,每个数表示这个词要不要出现,1表示出现,-1表示不出现,0表示无所谓。数据保证每行至少出现一个1。
输出
-
共M行,每行对应一个查询。输出查询到的文档编号,按照编号升序输出。
如果查不到任何文档,输出"NOT FOUND"。
样例输入
-
3 3 1 2 3 1 2 1 3 3 1 1 1 1 -1 0 1 -1 -1
样例输出
-
NOT FOUND 1 3 1
#include<iostream> #include<cmath> #include<cstring> #include<algorithm> #include<iomanip> #include<queue> #include<stack> #include<vector> #include<set> #include<map> using namespace std; set<int>Word[1005]; int tag[1005]; int main() { int n,m,c; cin>>n; for(int i=1;i<=n;++i) { cin>>m; for(int j=0;j<m;++j) { cin>>c; Word[i].insert(c); } } cin>>m; while(m--) { for(int i=1;i<=n;++i) { cin>>tag[i]; } set<int>result; for(int i=1;i<=n;++i) { if(tag[i]!=1)continue; if(result.empty()) { result.insert(Word[i].begin(),Word[i].end()); continue; } set<int>tmp; set<int>::iterator it=Word[i].begin(); for(;it!=Word[i].end();++it) { if(result.find(*it)!=result.end()) tmp.insert(*it); } result=tmp; if(result.empty())break; } for(int i=1;i<=n;++i) { if(tag[i]!=-1)continue; set<int>::iterator it=Word[i].begin(); for(;it!=Word[i].end();++it) { result.erase(*it); } } if(result.empty())cout<<"NOT FOUND"; else { set<int>::iterator it=result.begin(); for(;it!=result.end();++it) { cout<<*it<<" "; } } cout<<endl; } return 0; }