题目背景

滚粗了的HansBug在收拾旧英语书,然而他发现了什么奇妙的东西。

题目描述

udp2.T3如果遇到相同的字符串,输出后面的

蒟蒻HansBug在一本英语书里面找到了一个单词表,包含N个单词(每个单词内包含大小写字母)。现在他想要找出某一段连续的单词内字典序最大的单词。

输入输出格式

输入格式:

第一行包含两个正整数N、M,分别表示单词个数和询问个数。

接下来N行每行包含一个字符串,仅包含大小写字母,长度不超过15,表示一个单词。

再接下来M行每行包含两个整数x、y,表示求从第x到第y个单词中字典序最大的单词。

输出格式:

输出包含M行,每行为一个字符串,分别依次对应前面M个询问的结果。

输入输出样例

输入样例#1:

5 5
absi
hansbug
lzn
kkk
yyy
1 5
1 1
1 2
2 3
4 4
输出样例#1:

yyy
absi
hansbug
lzn
kkk

说明

样例说明:

第一次操作:在{absi,hansbug,lzn,kkk,yyy}中找出字典序最大的,故为yyy

第二次操作:在{absi}中找出字典序最大的,故为absi

第三次操作:在{absi,hansbug}中找出字典序最大的,故为hansbug

第四次操作:在{hansbug,lzn}中找出字典序最大的,故为lzn

第五次操作:在{kkk}中找出字典序最大的,故为kkk

数据规模:

注意事项:1.该题目单词字典序比对过程中大小写不敏感,但是输出必须输出原单词

2.该题目时间限制为0.2s


此题暴力给字符串比较大小是玄学,80~AC

正解:trie树给字符串排序,st表做RMQ

先序遍历就是排序

一堆RE,结果发现len打成n了

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N=,L=;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int n,m,l,r;
char s[N][],a[];
int ch[N*L][],size=,val[N*L];
void insert(char s[],int n,int id){
int u=;
for(int i=;i<=n;i++){
int v=s[i]-'a';
if(!ch[u][v]) ch[u][v]=++size;
u=ch[u][v];
}
val[u]=id;//printf("ins %d %d\n",u,id);
}
int rank[N],p=;
void dfs(int u){//printf("dfs %d\n",u);
if(val[u]) rank[val[u]]=++p;
for(int i=;i<;i++) if(ch[u][i]) dfs(ch[u][i]);
} int mx[N][];
inline int maxs(int i,int j){return rank[i]>rank[j]?i:j;}
void initRMQ(){
for(int i=;i<=n;i++) mx[i][]=i; for(int j=;j<=;j++)
for(int i=;i+(<<j)-<=n;i++)
mx[i][j]=maxs(mx[i][j-],mx[i+(<<(j-))][j-]);
}
inline int query(int l,int r){
int k=log(r-l+)/log();
return maxs(mx[l][k],mx[r-(<<k)+][k]);
}
int main(){
n=read();m=read();
for(int i=;i<=n;i++){
scanf("%s",s[i]+);
int len=strlen(s[i]+);
for(int j=;j<=len;j++) a[j]=s[i][j]<'a'?s[i][j]+'a'-'A':s[i][j];
insert(a,len,i);
}
dfs();//sort
//for(int i=1;i<=n;i++) printf("%d %d\n",i,rank[i]);
initRMQ();
for(int i=;i<=m;i++){
l=read();r=read();
printf("%s\n",s[query(l,r)]+);
}
}

洛谷P2412 查单词 [trie树 RMQ]的更多相关文章

  1. 洛谷 P2412 查单词

    P2412 查单词 题目背景 滚粗了的HansBug在收拾旧英语书,然而他发现了什么奇妙的东西. 题目描述 udp2.T3如果遇到相同的字符串,输出后面的 蒟蒻HansBug在一本英语书里面找到了一个 ...

  2. 洛谷 P3384 【模板】树链剖分-树链剖分(点权)(路径节点更新、路径求和、子树节点更新、子树求和)模板-备注结合一下以前写的题目,懒得写很详细的注释

    P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节 ...

  3. 洛谷p3384【模板】树链剖分题解

    洛谷p3384 [模板]树链剖分错误记录 首先感谢\(lfd\)在课上调了出来\(Orz\) \(1\).以后少写全局变量 \(2\).线段树递归的时候最好把左右区间一起传 \(3\).写\(dfs\ ...

  4. PKU 2513 Colored Sticks(并查集+Trie树+欧拉路径(回路))

    题目大意: 给定一些木棒,木棒两端都涂上颜色,求是否能将木棒首尾相接,连成一条直线,要求不同木棒相连接的一端必须是同颜色的. 解题思路: 可以用图论中欧拉路的知识来解这道题,首先可以把木棒两端看成节点 ...

  5. 【BZOJ】1012: [JSOI2008]最大数maxnumber /【洛谷】1198(线段树)

    Description 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. 插 ...

  6. 洛谷 P3359 改造异或树

    题目描述 给定一棵n 个点的树,每条边上都有一个权值.现在按顺序删掉所有的n-1条边,每删掉一条边询问当前有多少条路径满足路径上所有边权值异或和为0. 输入输出格式 输入格式: 第一行一个整数n. 接 ...

  7. 洛谷P3688/uoj#291. [ZJOI2017]树状数组

    传送门(uoj) 传送门(洛谷) 这里是题解以及我的卡常数历程 话说后面那几组数据莫不是lxl出的这么毒 首先不难发现这个东西把查询前缀和变成了查询后缀和,结果就是查了\([l-1,r-1]\)的区间 ...

  8. 洛谷题解P4314CPU监控--线段树

    题目链接 https://www.luogu.org/problemnew/show/P4314 https://www.lydsy.com/JudgeOnline/problem.php?id=30 ...

  9. Luogu1738 | 洛谷的文件夹 (Trie+STL)

    题目描述 kkksc03是个非凡的空想家!在短时间内他设想了大量网页,然后总是交给可怜的lzn去实现. 洛谷的网页端,有很多文件夹,文件夹还套着文件夹. 例如:\(/luogu/application ...

随机推荐

  1. C#~异步编程再续~await与async引起的w3wp.exe崩溃

    返回目录 最近怪事又开始发生了,IIS的应用程序池无做挂掉,都指向同一个矛头,async,threadPool,Task,还有一个System.NullReferenceException,所以这些都 ...

  2. 使用 Visual Studio Online 进行协同开发

    Visual Studio Online(原来的 Team Foundation Service),是项目数据在云中的主页.在我们的云基础架构中只需数分钟便可启动并运行,无需安装或配置任何服务器.设置 ...

  3. 记安装EP时在指定BCP账户信息时提示AOS无法访问的解决方法

    因为卡在这个问题上好久,外加同事也有遇到,因此记下来! 环境:Windows Server 2012 R2 Standard + Dynamics AX 2012 R2 + SharePoint 20 ...

  4. csharp: MySQL Stored Procedure using DAL

    # 建表 塗聚文 20160907 drop table attendrecord; create table attendrecord ( seq INT NOT NULL PRIMARY KEY ...

  5. c++ const 成员函数

    第一个事实: 某类中可以这么声明定义两个函数,可以重载(overload) void pa(){ cout<<"a"<<endl; } void pa() ...

  6. PHP运算符

    运算符 PHP运算符可以根据操作数的个数分为一元运算符.二元运算符.三元运算符.一元运算符例如!(取反运算符)或++(加一运算符),PHP支持的大多数运算符都是这种二元运算符,例如+.-.*./等算数 ...

  7. 【工匠大道】markdown使用技巧

    本文地址 提纲: 1. 概述 2. 常见技巧 3. 参考文档 1. 概述 常见的markdown的技巧,这里不再谈了,主要是自己感觉比较少见但有用的技巧. 2. 常见技巧   1)[空格]生成空格的效 ...

  8. 你的USB设备还安全吗?USB的安全性已从根本上被打破!

    前言: USB设备使用方便,但也可能被用来携带恶意软件.病毒,感染计算机系统.通过禁用自动播放功能.杀毒软件查杀.不定期的对设备进行格式化等操作可以确保它是干净的.但它存在的安全问题要比我们想象的更深 ...

  9. SharePoint 2013 对二进制大型对象(BLOB)进行爬网

    本文是参考MSDN文档做的示例,SharePoint 2013搜索二进制对象(BLOB),通过外部内容类型的方式将外部数据与SharePoint相关联,修改BCD模型,使SharePoint能够爬网外 ...

  10. iOS之POST与GET的优缺点

    //请求数据时传参数要将汉字转码 //GET获取数据,所有的参数信息都会暴露 GET方法和POST方法对比: 优点: GET: 1.请求方便,直接用一个完整的路径去请求获取数据 2.发送求请求过程中不 ...