P3879

[TJOI2010] 阅读理解

题目描述

英语老师留了 \(N\) 篇阅读理解作业,但是每篇英文短文都有很多生词需要查字典,为了节约时间,现在要做个统计,算一算某些生词都在哪几篇短文中出现过。

输入格式

第一行为整数 \(N\) ,表示短文篇数,其中每篇短文只含空格和小写字母。

按下来的 \(N\) 行,每行描述一篇短文。每行的开头是一个整数 \(L\) ,表示这篇短文由 \(L\) 个单词组成。接下来是 \(L\) 个单词,单词之间用一个空格分隔。

然后为一个整数 \(M\) ,表示要做几次询问。后面有 \(M\) 行,每行表示一个要统计的生词。

输出格式

对于每个生词输出一行,统计其在哪几篇短文中出现过,并按从小到大输出短文的序号,序号不应有重复,序号之间用一个空格隔开(注意第一个序号的前面和最后一个序号的后面不应有空格)。如果该单词一直没出现过,则输出一个空行。

样例 #1

样例输入 #1

3
9 you are a good boy ha ha o yeah
13 o my god you like bleach naruto one piece and so do i
11 but i do not think you will get all the points
5
you
i
o
all
naruto

样例输出 #1

1 2 3
2 3
1 2
3
2

提示

对于 \(30\%\) 的数据, \(1\le M\le 10^3\)

对于 \(100\%\) 的数据,\(1\le M\le 10^4\)\(1\le N\le 10^3\)

每篇短文长度(含相邻单词之间的空格)\(\le 5\times 10^3\) 字符,每个单词长度 \(\le 20\) 字符。

每个测试点时限 \(2\) 秒。

认真看题! TMD不让输出多余空格……
还要注意 这题不能再像八数码那样用字符串存 因为文章数>=10
可以用结构体map 其中装一个vector<int> 即可

细节!

点击查看代码
#include<bits/stdc++.h>
using namespace std;
int n,l,m;
struct did{
	vector<int>jl;
};
map<string,did>ma;
int main()
{
	ios::sync_with_stdio(false);
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>l;
		string s;
		while(l--)
		{
			cin>>s;
			int len=ma[s].jl.size();
			if(!len)ma[s].jl.push_back(i);
			else
			{
				if(ma[s].jl[len-1]!=i)ma[s].jl.push_back(i);
			}
		}
	}
	cin>>m;
	while(m--)
	{
		string s;
		cin>>s;
		int len=ma[s].jl.size();
		if(!len)
		{
			cout<<"\n";
			
		}
		else
		{
			cout<<ma[s].jl[0];
			for(int i=1;i<len;i++)cout<<" "<<ma[s].jl[i];
			cout<<"\n";
		}
	}
	return 0;
}
posted @ 2023-01-08 17:49  PKU_IMCOMING  阅读(6)  评论(0)    收藏  举报