题目描述:

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

输入格式

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

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

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

输出格式

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

输入输出样例

输入 #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 ≤ M ≤ 10^3。

对于 100%100%100% 的数据,1 ≤ M ≤ 10^4
1 ≤ N ≤ 10^3 。

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

每个测试点时限 2 秒。

---------------------------分割线-------------------------------

第一反应是用桶排,如果能把单词表示成一个编码,直接用int数组就可以做了,但是显然,20个字母组成的单词编码的数据会很大。

但我可以想到可以退而求其次:对字母的前两个字母进行编码,编码相同的单词存储到同一个map< string , list>中,string记录单词,list记录单词在哪几个文章中出现。这样的由于前两个字母都一样的单词很少,查找几乎是线性时间就能结束。

建立一个这样的数组存储所有的单词。
map<string,list >article[27][27];
编码使用如下规则
编码=字符ASCII码−′a′+1编码 = 字符ASCII码 - 'a' + 1编码=字符ASCII码−′a′+1
如何存储呢?假如是单词是“abc”,‘a’ - ‘a’ + 1 = 1;‘b’ - ‘a’ + 1 = 2把它存在article[1][2]里。
特别的,仅有一个字母的单词,比如"a" 存储在article[1][0]中。

查找单词时按照同样的规则。

AC代码:

#include<iostream>
#include<string>
#include<map>
#include<list>
using namespace std;map<string,list<int> >article[27][27];string key;//待查询的单词void Read(int n);//输入第n篇文章
void Solve();
int main()
{int n, m;cin >> n;for(int i = 1; i <= n; ++i)Read(i);cin >> m;for(int i = 0; i < m; ++i){cin >> key;Solve();}return 0;
}void Read(int n)
{int l;cin >> l;list<int>tmp;tmp.push_back(n);for(int i = 0; i < l; ++i){string w;cin >> w;int c = w[0] - 'a' + 1;int d = 0;if(w.size() > 1)d = w[1] - 'a' + 1;//进行编码pair<map<string,list<int> >::iterator,bool> flag = article[c][d].insert(make_pair(w,tmp));if(!flag.second)//如果插入失败flag.first->second.push_back(n);}
}
void Solve()
{int a = key[0] - 'a' + 1;int b = 0;if(key.size() > 1)b = key[1] - 'a' + 1;map<string,list<int> >::iterator flag = article[a][b].find(key);if(flag != article[a][b].end()){list<int> *itr = &(flag->second);int tmp = itr->front();cout << tmp ;for(list<int>::iterator i = itr->begin(); i != itr->end(); ++i){if(*i != tmp){cout << " " << *i;}//注意list可能会插入多个相同的数值,所以需要与前一个数字比较判断tmp = *i;}}cout << endl;
}

洛谷P3879 [TJOI2010] 阅读理解 哈希Hash解法相关推荐

  1. 洛谷P3879 [TJOI2010] 阅读理解 题解

    洛谷P3879 [TJOI2010] 阅读理解 题解 题目链接:P3879 [TJOI2010] 阅读理解 题意: 英语老师留了 NNN 篇阅读理解作业,但是每篇英文短文都有很多生词需要查字典,为了节 ...

  2. P3879 [TJOI2010]阅读理解 [STL]

    P3879 [TJOI2010]阅读理解 我永远喜欢STL 显然要用到哈希类似的东西,说到哈希我就想到了map. 但是map怎么存一串数字还不MLE啊?说到存一串数字还不MLE我就先到了vector. ...

  3. Trie树【洛谷P3879】 [TJOI2010]阅读理解

    P3879 [TJOI2010]阅读理解 题目描述 英语老师留了N篇阅读理解作业,但是每篇英文短文都有很多生词需要查字典,为了节约时间,现在要做个统计,算一算某些生词都在哪几篇短文中出现过. 输入输出 ...

  4. map集合——阅读理解(洛谷 P3879)

    题目选自洛谷P3879 直接用map<string,vecotr<int> > 代替这题里的trie树,注意开map的时候后面两个> >之间要有一个空格. 用vec ...

  5. [TJOI2010]阅读理解

    题目描述 英语老师留了N篇阅读理解作业,但是每篇英文短文都有很多生词需要查字典,为了节约时间,现在要做个统计,算一算某些生词都在哪几篇短文中出现过. 输入输出格式 输入格式: 第一行为整数N,表示短文 ...

  6. 洛谷P2462 [SDOI2007]游戏(哈希+最长路)

    题面 传送门 题解 我们把字符的出现次数哈希起来,然后把每个点向能在它之后的点连边.那么这显然是一个\(DAG\),直接求最长路就行了 //minamoto #include<bits/stdc ...

  7. 洛谷4895 独钓寒江雪 (树哈希+dp+组合)

    qwq 首先,如果是没有要求本质不同的话,那么还是比较简单的一个树形dp 我们令dp[i][0/1]dp[i][0/1]dp[i][0/1]表示是否iii的子树,是否选iii这个点的方案数. 一个比较 ...

  8. 洛谷3871 [TJOI2010]中位数 维护队列的中位数

    题目描述 给定一个由N个元素组成的整数序列,现在有两种操作: 1 add a 在该序列的最后添加一个整数a,组成长度为N + 1的整数序列 2 mid 输出当前序列的中位数 中位数是指将一个序列按照从 ...

  9. 洛谷回文数c语言,【普及-】洛谷P1015:回文数 一种解法

    解法 这里考虑到进制的问题,需要把所输入的数字作为字符串(数组名为origin,16进制为大写字母),然后通过转换化为一个个的十进制数位,作为数组的数据元素,这样,在判断是否回文的时候直接从数组两边取 ...

最新文章

  1. 【年度技术观点合集】计算机视觉,自然语言,机器学习…看看顶级科学家们怎么说
  2. POJ - 2987 Firing(最大权闭合图)
  3. 《Two Dozen Short Lessons in Haskell》学习(十)- Private Definitions — the where-clause
  4. 分布式拒绝服务攻击(DDoS)原理及防范
  5. 剑指 Offer 32 . 从上到下打印二叉树
  6. android ListView ListSelector 不起作用(被覆盖)
  7. UML和模式应用5:细化阶段(5)---系统顺序图
  8. 下载.Net Framework离线安装文件的办法
  9. html简单个人网页制作网站设计——腾讯游戏官网(13页) HTML+CSS+JavaScript web网页设计与开发
  10. Python编程通过出生日期判断星座
  11. 选型宝访谈:怎样构建端到端的IT透视能力?
  12. SAP 固定资产期初导入
  13. 梦里不知身是客,一晌贪欢。—第五十一天
  14. Git使用教程:完全图解!
  15. 整理:console的用法
  16. 嵌入式开发:使用条件复杂度测试嵌入式软件
  17. 基于simulink的三相STATCOM实现直流电容的稳压控制,采用IpIq控制方法和电流空间和电压空间的PWM方法控制
  18. Vue小黑记事本案例
  19. 出售一系列设计软件及其他
  20. Docker 基本操作 数据卷 -- docker 数据卷基本操作、挂载数据卷

热门文章

  1. 判断页面环境是否在小程序的webview中
  2. windows下db2的一些使用心得(不含安装)
  3. 201609-1-最大波动
  4. 1.5万字详述 | 全开源:python写小游戏+AI强化学习与传统DFS/BFS控制分别实现
  5. Linux教程:10条秘诀确保Linux桌面安全性
  6. [实战]MVC5+EF6+MySql企业网盘实战(24)——视频列表
  7. antimalware可以关闭吗_微信小程序可以关闭吗?如何关闭?
  8. 文都计算机统考讲义,考研计算机文都基础班讲义.doc
  9. ubuntu pcl 点云库使用
  10. linux记录iptables日志,linux – 如何配置syslog.conf文件,在单独的文件中记录iptables消息?...