• 【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

    隐约雷鸣,阴霾天空,但盼风雨来,能留你在此。

    隐约雷鸣,阴霾天空,即使天无雨,我亦留此地。

  • 相关阅读:
    PHP jquery结合HTML5鼠标拖选头像图片并上传
    HTML5 CSS3 SwitchButton 自定义Radio风格
    IE浏览器在虚拟机中无法正常显示字符
    jQuery在updatepanel中使用造成内存泄露
    bootstrap下拉列表重置联动
    bootstrap正则表达式验证手机 座机 邮箱
    bootstrap重置校验方法
    分页
    函数解一元二次方程
    集合
  • 原文地址:https://www.cnblogs.com/MisakaAzusa/p/9217289.html
Copyright © 2020-2023  润新知