大 LCP 时代(stupid.*)

news/2025/9/25 22:16:42/文章来源:https://www.cnblogs.com/Starpop/p/19112179

大 LCP 时代(stupid.*)

题目描述

LCP 就是传说中的最长公共前缀,至于为什么要加上一个大字,那是因为…你会知道的(有大病)。

首先,求LCP就要有字符串。既然那么需要它们,那就给出n个字符串好了。

于是你需要回答询问大LCP:询问给出一个 \(k\),你需要求出前 \(k\) 个字符串中两两的 LCP 最大值是多少

输入描述

第一行一个整数 \(N\)\(Q\),分别表示字符串个数和询问次数。

接下来 \(N\) 行,每行一个字符串。

\(Q\) 行,每行一个正整数 \(k\)

输出描述

\(Q\) 行,依次分别表示对 \(Q\) 个询问的答案。

输入输出样例

输入样例#1

3 3
a
b
ab
1
2
3

输出样例#1

0
0
1

提示/说明

数据范围

  • 对于 \(30\)% 的数据,字符串的总长度不超过 \(10^4\)\(1 \leq N \leq 10^3\)\(1 \leq Q \leq 10\)
  • 另外 \(30\)% 的数据,字符串的总长度不超过 \(10^4\)\(1 \leq N \leq 10^3\)\(1 \leq Q \leq 10^3\)
  • 对于 \(100\)% 的数据,字符串的总长度不超过 \(10^6\)\(1 \leq N \leq 10^5\)\(1 \leq Q \leq 10^5\)

解题报告

wow!超级善良的字符串题。

显然,我们不需要执着于在线查询,离线计算每一个 \(k\) 是更好的选择。

在转化一下,我们只需求出插入第 \(k\) 个字符串时,它和前 \(k-1\) 个字符串的最大 LCP 就可以了,设这个值为 \(ans_k\)。我们只需在最后对数组 \(ans\) 求一次前缀最大值,就可以求出前 \(k\) 个字符串的最大 LCP。

那么怎么求 \(ans_k\)

直接上字典树。

显然,我们知道字典树在存储字符串时会合并相同前缀,这正适合求 \(ans_k\),我们只需在把字符串 \(k\) 插入字典树时统计以下已存在的节点就好了。

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
const int N=1001100;
const int chn=26;#define ckmax(x,y) ( x=max(x,y) )
#define ckmin(x,y) ( x=min(x,y) )inline int read()
{int f=1,x=0; char ch=getchar();while(!isdigit(ch)) { if(ch=='-') f=-1; ch=getchar(); }while(isdigit(ch))  { x=x*10+ch-'0';    ch=getchar(); }return f*x;
}int n,m;
int ans[N];int T[N<<4][chn],idx;
char s[N];inline int Invert(char *s)
{int u=0,ans=0;for(int i=1;s[i];i++){int ch=s[i]-'a';if(!T[u][ch])T[u][ch]=++idx;else ans++;u=T[u][ch];}return ans;
}signed main()
{freopen("stupid.in","r",stdin);freopen("stupid.out","w",stdout);n=read(),m=read();for(int i=1;i<=n;i++){scanf("%s",s+1);s[strlen(s+1)+1]=0;ans[i]=Invert(s);}for(int i=1;i<=n;i++)ckmax(ans[i],ans[i-1]);for(int i=1;i<=m;i++)printf("%d\n",ans[read()]);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/917608.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站中的滑动栏怎么做的四川建设网网

虚拟技术十分热门.虚拟技术是将一台物理硬件计算机虚拟成多台软件计算机.每一台虚拟出来的软件计算机(以下叫做虚拟机)用起来都就象是在用那台被虚拟的硬件计算机(以下叫做真实机)完全一样.当然这样的说法忽略了虚拟机相对于真实机在执行效益上不可避免所存在的损失.所以如何减…

实用指南:Python实现手榴弹爆炸算法(Grenade Explosion Method, GEM)(附完整代码)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Day08-C:\Users\Lenovo\Desktop\note\code\JavaSE\Basic\src\com\David\array-ArrayDemo01~07

数组首先要声明数组变量才能使用如dataType[] arrayRefVar; java语言中使用new操作来创建数组,如dataType[ ] arrayRefVar = new dataType[arraysize] 数组通过索引访问,索引从0开始内存分析堆:存放new的对象和数组…

yolov10_float16.tflite TO yolov10_int8.tflite

使用google colab平台1. 安装ultralytics!pip install ultralytics2. 导入yolo并从ultralytics加载yolov10n.ptfrom ultralytics import YOLO model = YOLO("https://github.com/ultralytics/assets/releases/dow…

ansible注意的和错误代码分析

一、需要注意的点分清楚这个是主控节点还是被控节点的操作,有的时候是一个文件从主控到被控节点,还是被控节点的文件到主控节点上面了剧本执行报错代码 # 仔细看,报错的原因就是ansibel_lvm 未定义,写错了变量名TA…

用 Rust 和 Tesseract OCR 识别验证码

一、背景介绍 Rust 是一种系统级编程语言,以性能和安全性著称。在自动化测试和数据分析场景中,验证码识别是一个常见挑战。结合 Tesseract OCR,我们可以使用 Rust 构建一个高效的验证码识别工具。本文将介绍如何使用…

基于寄存器地址amp;标准外设库的LED流水灯

实验任务2 1.1先在工程总文件夹中创建User,Library和Startup三个文件夹,然后右键keil中的文件夹Source Group 1添加工程所需的这三个文件夹。1.2分别在Library,Startup和User三个文件夹中添加必要的头文件和.c文件。…

用 Swift 和 Tesseract OCR 实现验证码识别

一、背景介绍 Swift 是 Apple 推出的现代化编程语言,广泛应用于 iOS 和 macOS 应用开发。结合 Tesseract OCR,可以在移动和桌面应用中高效地识别验证码。本文将展示如何使用 Swift 结合 Tesseract OCR 实现验证码自动…

Rust 和 Tesseract OCR 实现验证码识别

一、背景介绍 Rust 以其高性能和内存安全著称,适合构建高效的图像处理和 OCR 应用程序。本文将结合 Tesseract OCR,使用 Rust 实现验证码识别。 二、环境准备 2.1 安装 Rust 更多内容访问ttocr.com或联系1436423940 …

AI-Powered-ToDo-List

AI-Powered-ToDo-List https://github.com/fanqingsong/AI-Powered-ToDo-ListAI 智能任务管理器基于 LangGraph 和 React 的智能任务管理应用,支持传统手动管理和 AI 对话式管理两种方式。✨ 功能特性🎯 双重管理方…

Netty:完成RPC服务(实战)

Netty:完成RPC服务(实战)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco",…

Python 在 Web 开发中的应用与趋势

一、引言 🌐 随着互联网的普及和应用场景的不断拓展,Web 开发已经成为软件工程的核心组成部分。从简单的静态网页到复杂的交互式应用,Web 技术在近二十年间经历了飞速发展。而 Python,作为一门简洁优雅、功能强大…

网页设计怎么建站点店铺管理软件

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;MQ ⛺️稳中求进&#xff0c;晒太阳 定义 消息队列&#xff1a;一般我们简称为MQ(Message Queue) Message Queue :消息队列中间件&#xff0c;很多初学者认为&#xff0c;MQ通过消息的发送…

校园交友|基于SprinBoot+vue的校园交友网站(源码+数据库+文档) - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

LLM MOE的进化之路

1. 阅读前提 本次课一共讲解三个不同版本的 MOE,分别是基础版MOE,大模型训练用的 SparseMoE,还有 DeepSeek 用的比较多的 shared_expert 的 SparseMoE。 2. 版本1:基础版本MOE 输入是一个 Token, 输出是一个 Token…

相交链表-leetcode

题目描述 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交:题目数据 保证 整个链式结构中不存在环。 …

【pytorch】关于深度学习模型是怎么使数据从头流动到尾的

【pytorch】关于深度学习模型是怎么使数据从头流动到尾的Posted on 2025-09-25 21:52 SaTsuki26681534 阅读(0) 评论(0) 收藏 举报问题描述 之前在看cycleGAN的代码时想到一个问题 代码里用类的方式定义cycleGAN模…

AtCoder ARC114 总结 (A-C)

AtCoder ARC114 总结 A 50 内只有 15 个质数。\(2^{15}\) 枚举所有情况然后 \(O(n)\) check 即可。 B 若 \(i\to f(i)\) 连边,原题意相当于选出若干个环。答案即 \(2^{\text {环数}}-1\)。 C 考虑一开始每个数都有 \(…

松江郑州阳网站建设郑州专业网站设计

运维 | 使用 Docker 安装 Jenkins | Jenkins 前言 本期内容主要是为了学习如何通过 Docker 安装Jenkins&#xff0c;仅作为记录与参考&#xff0c;希望对大家有所帮助。 准备工作 系统&#xff1a;CentOS 7.9配置&#xff1a;4c8g 快速安装 下面以 Docker 方式安装 Jenkin…

告别单张保存!PPT 图片无损批量提取,这 3 种方法亲测有效!

告别单张保存!PPT 图片无损批量提取,这 3 种方法亲测有效! 谁懂啊!做 PPT 设计或者经常处理 PPT 的人,肯定遇到过这种崩溃场景:手里有个几百页的 PPT,每一页都插了好几张配图,要把这些图都弄出来用,只能一张张…