百练4093:倒排索引查询

总时间限制: 
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呢?


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值