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 ...
随机推荐
- 安装配置ZooKeeper及基本用法
要想学习分布式应用,ZooKeeper是一个绕不过去的基础系统.它为大型分布式计算提供开源的分布式配置服务.同步服务和命名注册. 今天先介绍系统的安装和基本使用,后续会推一些基本的Java使用代码. ...
- JavaScript AJAX PHP
AJAX PHP示例 AJAX用于创建更多交互式应用程序. 以下示例演示了当用户在输入字段中键入字符时,网页如何与Web服务器通信: <!DOCTYPE html> <html> ...
- Vue监控器watch的全面解析
前言 前面讲到了计算属性computed,这次讲的是监控器watch,主要任务就是监控变量的变化 正文 watch是一个对象,键是需要观察的表达式,值是对应回调函数.值也可以是方法名,或者包含选项的对 ...
- python学习2-数据库配置操作
1.创建实体类models-自定义数据库的字段与名称 class Register (models.Model): idCard=models.CharField(max_length=18) pwd ...
- Django 简单的验证码
创建一个 Django 项目:yanzhengma 和 应用 app01 修改 urls.py 文件 from django.contrib import admin from django.urls ...
- 使用ES对中文文章进行分词,并进行词频统计排序
前言:首先有这样一个需求,需要统计一篇10000字的文章,需要统计里面哪些词出现的频率比较高,这里面比较重要的是如何对文章中的一段话进行分词,例如“北京是×××的首都”,“北京”,“×××”,“中华” ...
- URL 路由系统 + views 函数
一.URL URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个URL调用这段 ...
- Delphi-基础(for循环)
1.判断0~10之间,当循环I=3时候跳出当前循环,当I等于8时候,退出当前循环. procedure Countand(); var I: Integer; begin do begin Write ...
- conan使用(一)--安装和应用
1. 安装conan 使用pip命令安装conan,如果没有安装pip的,可以先安装好python后,再安装pip. pip install conan 之后就可以使用conan命令. 2. 管理远程 ...
- c# 第15节 StringBuilder
本节内容: 1:StringBuilder 2:内容总结 1:StringBuilder 实例: 2:内容总结 项目: