【题解 Trie树 字符串】 C - New but Nostalgic Problem

题目描述:

在这里插入图片描述


分析:

题目中涉及到了若干字符串的公共前缀,显然可以用trie树去完成
建立trie树的同时,我们为了做题方便,用以下两个数组去记录一下trie树的信息:
t o t i tot_i toti表示以i为根的子树中有几个字符串, n u m i num_i numi表示以i结尾的字符串有几个

建立完trie树之后,就开始了解决问题的过程

题目中要我们找所有公共前缀的最小值
所以我们只需要从小到大枚举公共前缀,看当前公共前缀能否由k个字符串组合得到即可。

我们一层一层从小到大枚举。
假设当前公共前缀已经枚举到了 a b c abc abc
那么接下来就有两种情况:
第一种情况就是答案就是abc
第二种情况是答案是abc*

什么情况下,答案是abc呢?
首先,答案已经确定了至少有abc,也就是说目前挑选出的几个字符串中都是以abc打头的,可能就是abc,也可能是abc[a-z]
答案的第一部分贡献就是abc的个数 c n t 1 cnt1 cnt1
第二部分贡献就是abc[a-z]的个数 c n t 2 cnt2 cnt2
但是我们需要注意:这些abc[a-z]我们可以全部取吗?
显然是不行的,对于每一种情况,我们至多取一个字符串
不然,答案就会出现变化。
比如,我们取了两个abca,那么答案显然就变成了abca
所以,在答案不改变的情况下,我们对于每种情况至多只能取出一个字符串

当cnt1+cnt2>=k时,说明我们能找出至少k个字符串,使得他们的前缀是abc,这个时候答案确定。

但是当 c n t 1 + c n t 2 < k cnt1+cnt2<k cnt1+cnt2<k时,说明答案应该是abc*,我们要继续往后面找
这个时候就没有上述的限制了(每种只能取一个),我们每种可以取若干个,同理,我们也是从小到大枚举,找到合适的那个字符(第一个字符串的和>=k的地方),而后按照上述的方式检验是否可行即可


Code

#include<bits/stdc++.h>
using namespace std;

const int N = 1e6+10;

int ch[N][26];
int num[N],tot[N];
int n,k;
int cnt = 0;

void Add(string s){
	int now = 1; tot[now]++;
	for (int i = 0; i < s.size(); i++){
		int x = s[i]-'a';
		if (ch[now][x] == 0){
			ch[now][x] = ++cnt;
			memset(ch[cnt],0,sizeof ch[cnt]);
		}
		now = ch[now][x]; tot[now]++;
	}
	num[now]++;
}

void Work(){
	scanf("%d %d",&n,&k);
	cnt = 1;
	memset(ch[1],0,sizeof ch[1]);
	tot[1] = 0 , num[1] = 0;
	for (int i = 1; i <= n; i++){
		string s; cin>>s;
		Add(s);
	}
	int now = 1;
	while (1){
		int nowt = num[now];
		for (int i = 0; i < 26; i++)
		  if (tot[ch[now][i]]) nowt++;
		if (nowt >= k){
			if (now == 1) {cout<<"EMPTY";}
			for (int i = 1; i <= cnt; i++) tot[i] = 0,num[i] = 0;
			cout<<endl; return;
		}
		for (int i = 0; i < 26; i++){
			if (tot[ch[now][i]] == 0) continue;
			nowt = nowt+tot[ch[now][i]]-1;
			if (nowt >= k){
				k = k-(nowt-tot[ch[now][i]]);
				cout<<(char)(97+i);
				now = ch[now][i];
				break;
			}
		}
	}
	return;
}

int main(){
	int t;
	scanf("%d",&t);
	while (t--) Work();
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ICBE 2024第十二届深圳国际跨境电商交易博览会

ICBE 2024第十二届深圳国际跨境电商交易博览会 暨中国跨境电商综试区发展高峰论坛 展会时间&#xff1a;2024年9月2日-4日 展会地点&#xff1a;深圳会展中心&#xff08;福田&#xff09; 指导单位:广东省商务厅 主办单位&#xff1a;广东省电子商务协会/扩展集团 承办单…

基于局部信息提取的人脸标志检测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 人脸检测 4.2 局部区域选择 4.3 特征提取 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 .........................................…

【LeetCode每日一题】2171. 拿出最少数目的魔法豆

2024-1-18 文章目录 [2171. 拿出最少数目的魔法豆](https://leetcode.cn/problems/removing-minimum-number-of-magic-beans/)思路&#xff1a; 2171. 拿出最少数目的魔法豆 思路&#xff1a; 对输入的数组进行排序&#xff0c;使得数组中的元素按照升序排列。初始化一个变量s…

python如何包含其他路径的模块

python 包含其他路径的模块&#xff1a; 例如目录结构: dir1 |__ init.py |__ module1.py dir2 |__ main.py main.py from dir1 import module1首先需要在 dir1 添加 init.py 文件&#xff0c;该文件可以是空文件。 其次需要将dir1 的父目录添加到python 解释器的&#xf…

小红书投放策略有哪些?品牌运营思路

想要在小红书进行合理的达人投放&#xff0c;离不开一份完备且具备可实施性的达人投放策略。今天我们和大家分享下小红书投放策略有哪些&#xff1f;品牌运营思路&#xff01; 制定小红书达人投放策略&#xff0c;按照以下四个步骤进行即可。 1、投放目的 这里的确定投放目的包…

跟着pink老师前端入门教程-day06

十一、CSS 的背景 通过CSS背景属性&#xff0c;可以给页面元素添加背景样式 背景属性可以设置背景颜色、背景图片、背景平铺、背景图片位置、背景图像固定等。 11.1 背景颜色 background-color 属性定义了元素的背景颜色 一般情况下元素背景颜色默认值是transparent&…

KubeSphere平台使用

KubeSphere官网地址&#xff1a;https://kubesphere.io/zh/ KubeKey一键部署K8S集群&#xff1a;https://kubesphere.io/zh/docs/v3.4/installing-on-linux/introduction/multioverview/ 一台master node&#xff08;初始化主节点&#xff09;、两台 work node&#xff08; joi…

2024-01-15(SpringMVCMybatis)

1.拦截器&#xff1a;如果我们想在多个handler方法(controller中的方法)执行之前或者之后都进行一些处理&#xff0c;甚至某些情况下需要拦截掉&#xff0c;不让handler方法执行&#xff0c;那么就可以使用SpringMVC为我们提供的拦截器。 拦截器和过滤器的区别&#xff1a;过滤…

浏览器插件:Web Scraper 基本用法和抓取页面内容(无需写代码,即可爬取数据)

Web Scraper 是一个浏览器扩展&#xff0c;用于从页面中提取数据(网页爬虫)。对于简单或偶然的需求非常有用&#xff0c;例如正在写代码缺少一些示例数据&#xff0c;使用此插件可以很快从类似的网站提取内容作为模拟数据。从 Chrome 的插件市场安装后&#xff0c;页面 F12 打开…

Python项目——搞怪小程序

1、介绍 使用python编写一个小程序&#xff0c;回答你是猪吗。 点击“是”提交&#xff0c;弹窗并退出。 点击“不是”提交&#xff0c;等待5秒&#xff0c;重新选择。 并且隐藏了关闭按钮。 2、实现 新建一个项目。 2.1、设计UI 使用Qt designer设计一个UI界面&#xff0c…

[bat]0基础实现自动化办公-新建bat脚本文件

一、引言 本文是自动化办公之路的开篇&#xff0c;主要面向0基础同学介绍如何新建一个bat脚本文件。接下来会逐渐深入讲解如何实现自动化办公&#xff0c;如有什么需求场景&#xff0c;可评论区留言&#xff0c;我后面会逐一实现。 二、方案 通过对text文本文档文件改文件后…

DETR 个人理解

DETR 个人理解 目录 DETR 个人理解 概念说明 transformer网络结构 整体流程 损失计算 整体理解 结果说明 论文 代码 参考链接 个人拙见&#xff0c;仅供参考&#xff0c;欢迎指正交流 这篇论文还是挺重要的&#xff0c;因为是transforms用于目标检测的第一篇论文&am…

一、Linux基础

一、Linux 1.1 Linux 的应用领域 1.1.1 个人桌面领域的应用 此领域是 Linux 比较薄弱的环节但是随着发展&#xff0c;近几年 linux 在个人桌面领域的占有率在逐渐提高 1.1.2 服务器领域 linux 在服务器领域的应用是最高的 linux 免费、稳定、高效等特点在这里得到了很好的…

OpenGL:关于渲染窗口在主屏和扩展屏上纹理贴图不一致的问题

自己写了一个例子&#xff0c;将图像纹理贴图到窗口&#xff0c;并且可以设置窗口的起始位置。 原始图像如下 当设置渲染窗口在主屏时&#xff0c;渲染的结果如下 没什么问题。 但是当设置窗口显示在扩展屏时&#xff0c;效果如下 可以看出纹理没有显示完整 网上找一下&…

Spring Boot整合Druid(druid 和 druid-spring-boot-starter)

引言 在现代的Web应用开发中&#xff0c;高性能的数据库连接池是确保应用稳定性和响应性的关键因素之一。Druid是一个开源的高性能数据库连接池&#xff0c;具有强大的监控和统计功能&#xff0c;能够在Spring Boot应用中提供出色的数据库连接管理。本文将研究在Spring Boot中…

【双端队列】【维护单调队列】Leetcode 239 滑动窗口最大值【难】

【双端队列】Leetcode 239 滑动窗口最大值 双端队列的操作解法1 利用双端队列实现单调队列 ---------------&#x1f388;&#x1f388;题目链接 Leetcode 239 滑动窗口最大值&#x1f388;&#x1f388;------------------- 双端队列的操作 创建双端队列&#xff1a;Deque<…

解决字符串类型转数字类型相加结果异常问题

js字符串类型转换数字类型有七种方法&#xff0c;分别是parseInt()&#xff0c;parseFloat()&#xff0c;Math.floor()&#xff0c;乘以数字&#xff08;*1&#xff09;&#xff0c;Number()&#xff0c;双波浪号 (~~number)&#xff0c;一元运算符&#xff08;number&#xff…

npm run dev 启动vue的时候指定端口

使用的是 Vue CLI 来创建和管理 Vue 项目&#xff0c; 可以通过设置 --port 参数来指定启动的端口号。以下是具体的步骤&#xff1a; 打开命令行终端 进入您的 Vue 项目目录 运行以下命令&#xff0c;通过 --port 参数指定端口号&#xff08;例如&#xff0c;这里设置端口号…

学习c语言,函数指针数组

上一个函数指针修改成函数数组

深入详解使用 RabbitMQ 过程中涉及到的多个细节问题(面试可用)

目录 1、基础类问题 2、cluster 相关问题 3、综合性问题 4、参考资料 C软件异常排查从入门到精通系列教程&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&#xff09;https://blog.csdn.net/chenlycly/article/details/125529931C/C基础与进阶&…