前言:

这个题一直有个疑问,最多一千行,每行五千字$1000\times5000=5e6$

$5e6\times26\times4\div1024\div1024\approx496Mb>125Mb$

尽管清楚实际空间需求不能到达$5e6$,如何计算直接对文章建$Trie$事实上所需的最大空间呢,本人对此并不清楚,也希望有大佬能为我解决一下这个问题(至于开$5e6\times26$通过的大佬,我想我这种凡人还达不到这个境界)

那么,就请我们权且认为直接对文章建$Trie$在空间上是不被允许的,至少是不够保险的

正文:

于是提供一种同样是基于$Trie$的方法——对询问建$Trie$

$10000\times20\times26\times4\div1024\div1024\approx20Mb$

占空间最多的$Trie$解决了,空间问题就不必担心了

下面我们考虑对询问建$Trie$下这个问题的解决

(这不是$Trie$的板子题吗,有什么可考虑的)

好吧,代码实现细节及一些注意事项,见代码了

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<vector>
  5. #include<algorithm>
  6. using namespace std;
  7. const int maxn=5e6,maxq=2e5+;
  8. int cnt,a[maxq][],n,m;
  9. vector<string>v[];
  10. vector<int>ans[],val[maxq];
  11. string tmp;
  12. int idx(char c)
  13. {
  14. return c-'a';
  15. }
  16. void insert(int x)
  17. {
  18. cin>>tmp;
  19. int len=tmp.length(),now=;
  20. for(int i=;i<len;i++)
  21. {
  22. int c=idx(tmp[i]);
  23. now=a[now][c]?a[now][c]:a[now][c]=++cnt;
  24. }
  25. val[now].push_back(x);
  26. /*因为可能有相同的查询,这里的简单地用一个
  27. 整形标记就不太合适了,我选择了用vector记录
  28. 这个节点作为所有询问的标记*/
  29. }
  30. void check(int x,int y)
  31. {
  32. int len=v[x][y].length(),now=;
  33. for(int i=;i<len;i++)
  34. {
  35. int c=idx(v[x][y][i]);
  36. if(!a[now][c])
  37. return;
  38. //这个单词一定没有被查询过,直接退回
  39. now=a[now][c];
  40. }
  41. for(int i=;i<val[now].size();i++)
  42. ans[val[now][i]].push_back(x);
  43. //同理在所有询问中保存这个单词曾经出现的文章
  44. }
  45. int main()
  46. {
  47. scanf("%d",&n);
  48. for(int i=,num;i<=n;i++)
  49. {
  50. scanf("%d",&num);
  51. for(int j=;j<=num;j++)
  52. {
  53. cin>>tmp;
  54. v[i].push_back(tmp);
  55. //采用了vector来存储原文
  56. }
  57. }
  58. scanf("%d",&m);
  59. for(int i=;i<=m;i++)
  60. insert(i);
  61. for(int i=;i<=n;i++)
  62. for(int j=;j<v[i].size();j++)
  63. check(i,j);
  64. for(int i=;i<=m;i++)
  65. {
  66. vector<int>::iterator pos=unique(ans[i].begin(),ans[i].end());
  67. for(vector<int>::iterator it=ans[i].begin();it!=pos;it++)
  68. printf("%d ",*it);
  69. printf("\n");
  70. }
  71. /*这里的输出,因为一篇文章里可能多次出现同一单词,
  72. 记得去重,一开始我用的unique,再输出vector中的
  73. 所有元素。但是unique去重时其实并没有删除这些元素
  74. 在这里也被坑了,所以改用迭代器*/
  75. return ;
  76. }

Luogu P3879 【[TJOI2010]阅读理解】的更多相关文章

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

    题目链接:https://www.luogu.org/problemnew/show/P3879 我先说一句: 我永远都喜欢StellaSTL 这个题,很明显就是 trie树 hash map+vec ...

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

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

  3. 洛谷 P3879 [TJOI2010]阅读理解

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

  4. P3879 [TJOI2010]阅读理解

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

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

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

  6. Trie树【P3879】 [TJOI2010]阅读理解

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

  7. LGOJ3879 TJOI2010 阅读理解

    不可否认,\(TJOI\)的这道题确实不难 为本题写博客的唯一原因就是 \(STL\)大法好!!!! Description link 不简述题意了,因为实在是简单 Solution 直接\(map& ...

  8. HTTPS强制安全策略-HSTS协议阅读理解

    https://developer.mozilla.org/en-US/docs/Web/Security/HTTP_strict_transport_security [阅读理解式翻译,非严格遵循原 ...

  9. Codeforces#543 div2 A. Technogoblet of Fire(阅读理解)

    题目链接:http://codeforces.com/problemset/problem/1121/A 真·阅读理解 题意就是 有n个人 pi表示他们的强度 si表示他们来自哪个学校 现在Arkad ...

随机推荐

  1. 关于BFS+异或(C++)

    今天早上,我们做了场比赛,里面有一个题目是这样的.. 题目大意:        随着马场的繁荣,出现了越来越多的新马种.种族之间的沟通不畅严重影响了马场的和谐.这时,科学家发明了马语翻译机器人,正好可 ...

  2. webpack4 code splitting

    demo 代码点此,webpack4 进行 code splitting 使用 split-chunks-plugin, 开始前先做点准备工作. start 安装: npm i -D webpack ...

  3. SQL行转列,列转行

    SQL 行转列,列转行 行列转换在做报表分析时还是经常会遇到的,今天就说一下如何实现行列转换吧. 行列转换就是如下图所示两种展示形式的互相转换 行转列 假如我们有下表: SELECT * FROM s ...

  4. Android RadioButton控件

    RadioButton   单选按钮 常用属性: text 文本 checked=“true” 默认选中 一组互斥的单选按钮要放在RadioGroup中.RadioGroup常用属性: orienta ...

  5. java实现word生成并转pdf

    前言 本篇博客主要解决java后台动态生成word(docx格式),并将word转换为pdf并添加水印. 思考 项目需求是要导出带水印的pdf,表格样式还是有点复杂的,之前考虑过用itextpdf根据 ...

  6. 多版本切换python

    Python 安装包去官网自行下载: https://www.python.org/downloads/mac-osx/ Mac os 自带python, 但我记得是python2.7版本 在选择安装 ...

  7. ZAP 代理 Chrome 系统 win10

    ZAP 代理原理 如下浏览器,拿Chrome为例,Chrome发出的请求都会先经过 ZAP, 然后再由 ZAP 发往服务器.如下图: Chrome 设置 1. Chrome设置只需要在地址栏输入 ch ...

  8. docker容器网络—单主机容器网络

    当我们在单台物理机或虚拟机中运行多个docker容器应用时,这些容器之间是如何进行通信的呢,或者外界是如何访问这些容器的? 这里就涉及了单机容器网络相关的知识.docker 安装后默认 情况下会在宿主 ...

  9. FCOS及其和Faster R-CNN的区别

    RetinaNet,SSD,YOLOv3,Faster R-CNN等都是Anchor-based的检测器,即需要预定义的Anchor boxes来进行训练.FCOS是一种Anchor-free和Pro ...

  10. Codeforces F. Maxim and Array(构造贪心)

    题目描述: Maxim and Array time limit per test 2 seconds memory limit per test 256 megabytes input standa ...