-
总时间限制:
- 1000ms 内存限制:
- 131072kB
-
描述
-
现在已经对一些文档求出了倒排索引,对于一些词得出了这些词在哪些文档中出现的列表。
要求对于倒排索引实现一些简单的查询,即查询某些词同时出现,或者有些词出现有些词不出现的文档有哪些。
输入
-
第一行包含一个数N,1 <= N <= 100,表示倒排索引表的数目。
接下来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 <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
bool b[101][1001], result[1001],flag;
int n,resultnumber;
char search[101];
int main()
{
int temp,temp2;
while (scanf("%d", &n) != EOF)
{
memset(b, false, sizeof(b));
memset(result,false,sizeof(result));
memset(search, 0, sizeof(search));
resultnumber = 0;
for (int i = 1; i <= n; i++)
{
scanf("%d", &temp);
for (int j = 1; j <= temp; j++)
{
scanf("%d", &temp2);
b[i][temp2] = true;
}
}
scanf("%d", &temp);
for (int j = 1; j <= temp; j++)
{
memset(result,false,sizeof(result));
resultnumber = 0;
for (int i = 1; i <= n; i++)
{
scanf("%d", &search[i]);
}
for (int i = 1; i <= 1000; i++)
{
flag = true;
for (int k = 1; k <= n; k++)
{
if((b[k][i]&&search[k] ==1)||(search[k] ==0)||(!b[k][i]&&search[k] ==-1))
{
continue;
}
else
{
flag = false;
break;
}
}
if (flag == true)
{
result[i] = true;
resultnumber++;
}
}
switch(resultnumber)
{
case 0:
printf("NOT FOUND\n");
break;
default:
for (int i = 1; i <= 1000; i++)
{
if (result[i] == true)
{
printf("%d", i);
resultnumber--;
if (resultnumber == 0)
{
printf("\n");
break;
}
else
{
printf(" ");
}
}
}
}
}
}
return 0;
}
可为啥WA呢?