首页 > 其他分享 >[TJOI2010] 阅读理解

[TJOI2010] 阅读理解

时间:2023-03-04 15:24:23浏览次数:50  
标签:短文 ch int 理解 单词 le TJOI2010 阅读 getchar

洛谷

题意:给定\(N\)篇短文,每篇短文由\(L\)个单词组成,且只含小写字母;做\(M\)次询问,每次给定一个单词,求该单词在哪几篇短文中出现过。对于 \(100\%\) 的数据,\(1\le M\le 10^4\),\(1\le N\le 10^3\) 。每篇短文长度(含相邻单词之间的空格)\(\le 5\times 10^3\) 字符,每个单词长度 \(\le 20\) 字符。

分析:接近于Trie字典树的模板题,建树的时候对于每个单词的尾节点,开一个\(vector\)数组记录属于哪些文章,注意可能同一篇短文出现同一个单词多次,这时只要插入一次短文的编号。查询的时候直接输出单词尾节点的\(vector\)数组内容即可。本题最奇怪的点在于数组大小,表面上最多可能会有\(5e6\)个字符,而且每个字符都要有一个26个小写字母的指针域,但是这样建肯定会\(MLE\),实际上肯定会有相同的字符共用一个节点,因此达不到\(5e6\),建\(1e6\)就好了。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
inline int read(){
    int x=0,o=1;char ch=getchar();
    while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
    if(ch=='-')o=-1,ch=getchar();
    while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    return x*o;
}
const int N=1e6+5;
const int M=3e5+5;
const int mod=998244353; 
int tot,ch[N][30];
vector<int>q[N];
void insert(string s,int num){
    int u=0;
    int len=s.size();
    for(int i=0;i<len;i++){
		int c=s[i]-'a';
		if(!ch[u][c])ch[u][c]=++tot;
		u=ch[u][c];
    }
    if(q[u].empty()||q[u][q[u].size()-1]!=num)q[u].push_back(num);
    return;
}
void find(string s){
	int len=s.size();
    int u=0;
    for(int i=0;i<len;i++){
    	int c=s[i]-'a';
        if(!ch[u][c]){
        	cout<<endl;
        	return;
		}
        u=ch[u][c];
    }
    for(int i=0;i<q[u].size();++i)cout<<q[u][i]<<" ";
	cout<<endl;
	return;
}
int main(){
    int n=read();
	for(int i=1;i<=n;++i){
		int L=read();
		for(int j=1;j<=L;++j){
			string s;
			cin>>s;
			insert(s,i);
		}
	}
	int m=read();
	for(int i=1;i<=m;++i){
		string s;
		cin>>s;
		find(s);
	}
    return 0;
}

标签:短文,ch,int,理解,单词,le,TJOI2010,阅读,getchar
From: https://www.cnblogs.com/PPXppx/p/17178342.html

相关文章

  • numpy深度学习常用函数及参数理解(axis, keepdims)
    axis:以axis=0为例,则沿着第0个下标(最左边的下标)变化的方向进行操作,也就是将除了第0个下标外,其他两个下标都相同的部分分成一组,然后再进行操作例如一个3*3的二维数组A(3,......
  • 3.理解JavaScript的执行上下文、执行上下文栈,可以应用堆栈信息快速定位问题
    1.执行上下文执行上下文就是当前JavaScript代码被解析和执行时所在环境的抽象概念,JavaScript中运行任何的代码都是在执行上下文中运行1.执行上下文的类型全局执行......
  • 2.理解JavaScript的作用域和作用域链
    什么是作用域Javascript中的作用域说的是变量的可访问性和可见性。也就是说整个程序中哪些部分可以访问这个变量,或者说这个变量都在哪些地方可见。作用域的类型全局作......
  • 1.理解词法作用域和动态作用域
    作用域?什么是作用域?作用域就是指程序源代码中定义变量的区域作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限。js采用词法作用域,也就是静态作用域。动......
  • 4.理解es6 class构造以及继承的底层实现原理
    javascript使用的是原型式继承,我们可以通过原型的特性实现类的继承,es6为我们提供了像面向对象继承一样的语法糖。1.类的实现class底层仍然是构造函数调用_classCallChe......
  • Faster RCNN 论文阅读
    1.网络架构VGG16网络anchors:人工放上去的RPN对anchors进行二分类,正样本,负样本RoIP:前面的框框已经圈出目标,但还不知道具体属于哪个类,它就是干这个工作的2.VGG网络V......
  • 轻量级服务器 TinyWebServer--参考理解下的笔记(声明:该项目非本人原创,仅作为练习,如有
    轻量级服务器TinyWebServer目录1.什么是WebServer(网络服务器)2.用户如何与你的Web服务器进行通信3.Web服务器如何接收客户端发来的HTTP请求报文4.Web服务器如何处理......
  • hash表 C++的使用以及理解
    hash表C++的使用以及理解1、哈希表定义哈希表(Hashtable,也叫哈希表),是根据关键码值(Keyvalue)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置......
  • 3月3日-阅读心得
    看书有点看上瘾了,先把这本书看完再上网课吧。不过今天白天摆了一天,到晚上才想起来看书,想想就亏。还有关于AI的训练,我经过多方查证和尝试之后,发现确实是硬件问题,我这台电脑......
  • Apache设置反向代理解决js跨域问题
    这是一个很简单的方案,通过启用Apache反向代理解决js跨域问题为什么要这么做?在现在的开发过程中大家会遇到这样一个问题:后端代码写好之后,前端的小伙伴需要将后端代码部署......