-
总时间限制:
- 1000ms 内存限制:
- 131072kB
-
描述
-
给定一些文档,要求求出某些单词的倒排表。
对于一个单词,它的倒排表的内容为出现这个单词的文档编号。
输入
-
第一行包含一个数N,1 <= N <= 1000,表示文档数。
接下来N行,每行第一个数c i,表示第i个文档的单词数。接下来跟着c i个用空格隔开的单词,表示第i个文档包含的单词。文档从1开始编号。1 <= c i <= 100。
接下来一行包含一个数M,1 <= M <= 1000,表示查询数。
接下来M行,每行包含一个单词,表示需要输出倒排表的单词。
每个单词全部由小写字母组成,长度不会超过256个字符,大多数不会超过10个字符。
输出
-
对于每一个进行查询的单词,输出它的
如果倒排表为空,输出"NOT FOUND"。 -
倒排表,文档编号按从小到大排序。
样例输入
-
3 2 hello world 4 the world is great 2 great news 4 hello world great pku
样例输出
1 1 2 2 3 NOT FOUND
直接hash。#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> #include<assert.h> #include<ctype.h> #include<stdlib.h> using namespace std; char box[100107][300];//存放字符串。 int wen[100107][101];//存放文档。 bool vis[100107]; int hash(char *st) { unsigned int seed = 131; unsigned int key = 0; while(*st) { key = key*seed + (*st++); } return (key & 0x7FFFFFFF)%100107; } int main() { int N; int i,j; scanf("%d",&N); for(i = 1; i <=N; i++ ) { wen[i][0]=0; vis[i] = 0; } int m; char str[300]; for(i = 1; i <= N; i++) { int num; scanf("%d",&num); while(num--) { scanf("%s",str); int key = hash(str); while(strcmp(box[key],str)&&vis[key])key+=3; strcpy(box[key],str); vis[key] = 1; int p=0; if( wen[key][p]==0)memset(wen[p],0,sizeof(wen[key])); while(wen[key][p]) { if(wen[key][p] == i)break; p++; } if(wen[key][p]!=i) wen[key][p] = i; } } int M; scanf("%d",&M); while(M--) { char temp[300]; scanf("%s",temp); int key = hash(temp); bool flag = 0; while(vis[key]&&!flag) { if(!strcmp(box[key],temp))flag = 1; else key+=3; } int p=0; if(flag) while(wen[key][p]){ printf(p?" %d":"%d",wen[key][p]); p++;} else printf("NOT FOUND"); if(M)printf("\n"); } return 0; }