【luogu P3879 [TJOI2010]阅读理解】 题解

题目链接:https://www.luogu.org/problemnew/show/P3879
我先说一句:

我永远都喜欢StellaSTL


这个题,很明显就是

trie树

hash

map+vector


思路:

直接用map<string,vecotr > 代替这题里的trie树,注意开map的时候后面两个> >之间要有一个空格。

用vector记录每个单词出现的句子位置,每遇到一个就把该单词所出现的句子的编号压入对应的vector里。

于是乎= =这就是最暴力的想法。

接下来我们利用一个桶来去重就完成了题目里的要求。(我会说我是因为没看见这个要求第一次提交爆零嘛qaq


Code:

#include <map>
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 100001;
int n, m, num, cnt[maxn];
string s;
map<string,vector<int> >a;
int main()
{	
	std::ios::sync_with_stdio(false);//要关闭同步,快很多
	cin>>n;
	for(int i = 1; i <= n; i++)
	{
		cin>>num;
		for(int j = 1; j <= num; j++)
		{
			cin>>s;
			a[s].push_back(i);//vector的压入操作。我每一个单词就是一个vector。
		}
	}
	cin>>m;
	for(int i = 1; i <= m; i++)
	{
		cin>>s;
		memset(cnt,0,sizeof(cnt));//cnt就是去重的桶。每用一次输出不同的查询要清零。
		for(int j = 0; j < a[s].size(); j++)//a[s].size()是vector自动返回其长度的函数。
		if(cnt[a[s][j]] == 0)
		{
			cout<<a[s][j]<<" ";//我们存的就是答案所求的所出现的句子的编号,所以直接输出不多bb。而且存的时候也是按顺序所记录的。
			cnt[a[s][j]]++;//别忘了用桶去重!
		}
		cout<<endl;
	}
	return 0;
}

结尾:

我的代码应该是很短的了,同学们应该要有利用stl的意识,但不能完全依靠stl,毕竟有很多东西也是stl现在所提供不了的。

两个STL应用使代码简短了很多。然而还是那句话,天上不会掉馅饼,程序的效率还是有所下降的。然而,效率不是全部,人们宁可牺牲三倍效率用Java而不用C语言就是最好的例子(from_ Charles E Leiserson_),具体取舍要看情况。

该手打的还是要会的。trie树还是要会的!

有什么问题交流欢迎+QQ 935145183/3203600070

posted @ 2018-06-23 15:10  Misaka_Azusa  阅读(213)  评论(0编辑  收藏  举报
Live2D