Luogu P3879 【[TJOI2010]阅读理解】
前言:
这个题一直有个疑问,最多一千行,每行五千字$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$的板子题吗,有什么可考虑的)
好吧,代码实现细节及一些注意事项,见代码了
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<vector>
- #include<algorithm>
- using namespace std;
- const int maxn=5e6,maxq=2e5+;
- int cnt,a[maxq][],n,m;
- vector<string>v[];
- vector<int>ans[],val[maxq];
- string tmp;
- int idx(char c)
- {
- return c-'a';
- }
- void insert(int x)
- {
- cin>>tmp;
- int len=tmp.length(),now=;
- for(int i=;i<len;i++)
- {
- int c=idx(tmp[i]);
- now=a[now][c]?a[now][c]:a[now][c]=++cnt;
- }
- val[now].push_back(x);
- /*因为可能有相同的查询,这里的简单地用一个
- 整形标记就不太合适了,我选择了用vector记录
- 这个节点作为所有询问的标记*/
- }
- void check(int x,int y)
- {
- int len=v[x][y].length(),now=;
- for(int i=;i<len;i++)
- {
- int c=idx(v[x][y][i]);
- if(!a[now][c])
- return;
- //这个单词一定没有被查询过,直接退回
- now=a[now][c];
- }
- for(int i=;i<val[now].size();i++)
- ans[val[now][i]].push_back(x);
- //同理在所有询问中保存这个单词曾经出现的文章
- }
- int main()
- {
- scanf("%d",&n);
- for(int i=,num;i<=n;i++)
- {
- scanf("%d",&num);
- for(int j=;j<=num;j++)
- {
- cin>>tmp;
- v[i].push_back(tmp);
- //采用了vector来存储原文
- }
- }
- scanf("%d",&m);
- for(int i=;i<=m;i++)
- insert(i);
- for(int i=;i<=n;i++)
- for(int j=;j<v[i].size();j++)
- check(i,j);
- for(int i=;i<=m;i++)
- {
- vector<int>::iterator pos=unique(ans[i].begin(),ans[i].end());
- for(vector<int>::iterator it=ans[i].begin();it!=pos;it++)
- printf("%d ",*it);
- printf("\n");
- }
- /*这里的输出,因为一篇文章里可能多次出现同一单词,
- 记得去重,一开始我用的unique,再输出vector中的
- 所有元素。但是unique去重时其实并没有删除这些元素
- 在这里也被坑了,所以改用迭代器*/
- return ;
- }
Luogu P3879 【[TJOI2010]阅读理解】的更多相关文章
- 【luogu P3879 [TJOI2010]阅读理解】 题解
题目链接:https://www.luogu.org/problemnew/show/P3879 我先说一句: 我永远都喜欢StellaSTL 这个题,很明显就是 trie树 hash map+vec ...
- P3879 [TJOI2010]阅读理解 题解
P3879 [TJOI2010]阅读理解 题解 题目描述 英语老师留了N篇阅读理解作业,但是每篇英文短文都有很多生词需要查字典,为了节约时间,现在要做个统计,算一算某些生词都在哪几篇短文中出现过. 输 ...
- 洛谷 P3879 [TJOI2010]阅读理解
P3879 [TJOI2010]阅读理解 题目描述 英语老师留了N篇阅读理解作业,但是每篇英文短文都有很多生词需要查字典,为了节约时间,现在要做个统计,算一算某些生词都在哪几篇短文中出现过. 输入输出 ...
- P3879 [TJOI2010]阅读理解
\(\color{#0066ff}{ 题目描述 }\) 英语老师留了N篇阅读理解作业,但是每篇英文短文都有很多生词需要查字典,为了节约时间,现在要做个统计,算一算某些生词都在哪几篇短文中出现过. \( ...
- Trie树【洛谷P3879】 [TJOI2010]阅读理解
P3879 [TJOI2010]阅读理解 题目描述 英语老师留了N篇阅读理解作业,但是每篇英文短文都有很多生词需要查字典,为了节约时间,现在要做个统计,算一算某些生词都在哪几篇短文中出现过. 输入输出 ...
- Trie树【P3879】 [TJOI2010]阅读理解
Description 英语老师留了N篇阅读理解作业,但是每篇英文短文都有很多生词需要查字典,为了节约时间,现在要做个统计,算一算某些生词都在哪几篇短文中出现过. Input 第一行为整数N,表示短文 ...
- LGOJ3879 TJOI2010 阅读理解
不可否认,\(TJOI\)的这道题确实不难 为本题写博客的唯一原因就是 \(STL\)大法好!!!! Description link 不简述题意了,因为实在是简单 Solution 直接\(map& ...
- HTTPS强制安全策略-HSTS协议阅读理解
https://developer.mozilla.org/en-US/docs/Web/Security/HTTP_strict_transport_security [阅读理解式翻译,非严格遵循原 ...
- Codeforces#543 div2 A. Technogoblet of Fire(阅读理解)
题目链接:http://codeforces.com/problemset/problem/1121/A 真·阅读理解 题意就是 有n个人 pi表示他们的强度 si表示他们来自哪个学校 现在Arkad ...
随机推荐
- 关于BFS+异或(C++)
今天早上,我们做了场比赛,里面有一个题目是这样的.. 题目大意: 随着马场的繁荣,出现了越来越多的新马种.种族之间的沟通不畅严重影响了马场的和谐.这时,科学家发明了马语翻译机器人,正好可 ...
- webpack4 code splitting
demo 代码点此,webpack4 进行 code splitting 使用 split-chunks-plugin, 开始前先做点准备工作. start 安装: npm i -D webpack ...
- SQL行转列,列转行
SQL 行转列,列转行 行列转换在做报表分析时还是经常会遇到的,今天就说一下如何实现行列转换吧. 行列转换就是如下图所示两种展示形式的互相转换 行转列 假如我们有下表: SELECT * FROM s ...
- Android RadioButton控件
RadioButton 单选按钮 常用属性: text 文本 checked=“true” 默认选中 一组互斥的单选按钮要放在RadioGroup中.RadioGroup常用属性: orienta ...
- java实现word生成并转pdf
前言 本篇博客主要解决java后台动态生成word(docx格式),并将word转换为pdf并添加水印. 思考 项目需求是要导出带水印的pdf,表格样式还是有点复杂的,之前考虑过用itextpdf根据 ...
- 多版本切换python
Python 安装包去官网自行下载: https://www.python.org/downloads/mac-osx/ Mac os 自带python, 但我记得是python2.7版本 在选择安装 ...
- ZAP 代理 Chrome 系统 win10
ZAP 代理原理 如下浏览器,拿Chrome为例,Chrome发出的请求都会先经过 ZAP, 然后再由 ZAP 发往服务器.如下图: Chrome 设置 1. Chrome设置只需要在地址栏输入 ch ...
- docker容器网络—单主机容器网络
当我们在单台物理机或虚拟机中运行多个docker容器应用时,这些容器之间是如何进行通信的呢,或者外界是如何访问这些容器的? 这里就涉及了单机容器网络相关的知识.docker 安装后默认 情况下会在宿主 ...
- FCOS及其和Faster R-CNN的区别
RetinaNet,SSD,YOLOv3,Faster R-CNN等都是Anchor-based的检测器,即需要预定义的Anchor boxes来进行训练.FCOS是一种Anchor-free和Pro ...
- Codeforces F. Maxim and Array(构造贪心)
题目描述: Maxim and Array time limit per test 2 seconds memory limit per test 256 megabytes input standa ...