前言:

这个题一直有个疑问,最多一千行,每行五千字$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]阅读理解】的更多相关文章

  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. JVM 学习总结

    目录 Java内存区域 运行时数据区 & Java 内存结构 & Java 内存区域 1. 程序计数器 2. Java 虚拟机栈 3. 本地方法栈 4. 堆 5. 方法区 6. 运行时 ...

  2. SQLi-LABS Page-2 (Adv Injections) Less27-Less29

    Less-27 GET - Error Based- All your UNION and select belong to us 过滤了union 和select的报错注入 查看源码: 使用%09 ...

  3. SWPUCTF 2019 web

    web1 知识点 ## information_schema绕过 ##无列名注入 注入点在广告申请广告名字处,申请广告名为 查看广告详细返回错误 接下来就是常规的union注入的套路,但是发现or被过 ...

  4. 一次http请求的过程

    http协议(超文本传输协议)是属于应用层的协议,网络分层:应用层(http协议,FTP),传输层(tcp,udp),网络层(ip/ARP),链路层 我们以浏览器向百度发送请求为例: http的发送: ...

  5. log4j每天生成一个文件配置

    log4j.rootLogger=INFO,CONSOLE,logDailyFile log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppenderlo ...

  6. Lodop打印表格带页头页尾 高度是否包含页头页尾 转载

    通过设置TableHeightScope,可以实现对ADD_PRINT_TABLE,表格带页头页尾,查看本博客另一篇博文:Lodop打印表格带页头页尾 自动分页每页显示头尾 超文本超过打印项高度,会自 ...

  7. adb连接夜神模拟器与adb常用操作命令

    adb connect 127.0.0.1:62001 adb kill-server 在关闭adb服务后,要使用如下的命令启动adb服务. adb start-servermore than one ...

  8. httpHandlers path="*.sky"

    <httpHandlers> <add verb="*" path="*.sky" type="WebAppHttpHandlerT ...

  9. JAVA并发-ReentrantReadWriteLock

    简介 读写锁维护着一对锁,一个读锁和一个写锁.通过分离读锁和写锁,使得并发性比一般的排他锁有了较大的提升:在同一时间可以允许多个读线程同时访问,但是在写线程访问时,所有读线程和写线程都会被阻塞. 读写 ...

  10. 【入门篇一】SpringBoot简介(1)

    官网:https://spring.io/projects/spring-boot 一.什么是SpringBoot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新S ...