当前位置: 首页 > news >正文

CF1200E Compress Words

题目描述

Amugae has a sentence consisting of n words. He want to compress this sentence into one word. Amugae doesn't like repetitions, so when he merges two words into one word, he removes the longest prefix of the second word that coincides with a suffix of the first word. For example, he merges "sample" and "please" into "samplease".

Amugae will merge his sentence left to right (i.e. first merge the first two words, then merge the result with the third word and so on). Write a program that prints the compressed word after the merging process ends.

输入格式

The first line contains an integer n ( 1≤n≤10^5 ), the number of the words in Amugae's sentence.

The second line contains n words separated by single space. Each words is non-empty and consists of uppercase and lowercase English letters and digits ('A', 'B', ..., 'Z', 'a', 'b', ..., 'z', '0', '1', ..., '9'). The total length of the words does not exceed 10^6 .

输出格式

In the only line output the compressed word after the merging process ends as described in the problem.

题意翻译

Amugae 有 n 个单词,他想把这个 n 个单词变成一个句子,具体来说就是从左到右依次把两个单词合并成一个单词。合并两个单词的时候,要找到最大的 i(i≥0),满足第一个单词的长度为 i 的后缀和第二个单词长度为 i 的前缀相等,然后把第二个单词第 i 位以后的部分接到第一个单词后面。输出最后那个单词。

注:题中的字符串存在大小写字母和数字。

输入输出样例

输入 #1

5
I want to order pizza

输出 #1

Iwantorderpizza

输入 #2

5
sample please ease in out

输出 #2

sampleaseinout

本题的解法有两种,一种是KMP算法,另一种是哈希算法,我使用的是哈希算法来求解

思路

本题有两个哈希值一个是主串的,一个是子串的,通过对比主串后缀的哈希值和子串前缀的哈希值来判断需要链接的部分,然后进行连接。

1.本题的坑点:题目的意思是合并单词前面的主串的后缀和此单词的前缀而不是前一个单词的后缀和后一个单词的前缀,举个例子:

给你3个单词:i,ab,iab,合并之后答案是iab,而不是iabiab。

2.采用哈希解法本题的难点:

1.本题需要采用字符串进制哈希且是双哈希,不然65数据过不了,所谓双哈希就是同时满足两个哈希函数,两个哈希函数有不同的key值和mod值。

2.对于主串求后缀的哈希值需要用O(1)速度,而不是暴力,否则时间过不了,

O(1)求字符串子串方法:

假设有一个 S=s1s2s3s4s5的字符串,根据定义,获取其 Hash值如下(我们先忽略MOD,方便理解):

haxi[1]=s1

haxi[2]=s1∗Base+s2

haxi[3]=s1∗Base^2+s2∗Base+s3

haxi[4]=s1∗Base^3+s2∗Base^2+s3∗Base+s4

现在我们想求字串 s3s4的hash值,不难得出为s3∗Base+s4,并且从上面观察,如果看hash[4]−hash[2]*Base^2,至此,通过对上例的归纳,可以得出如下的公式。

ans=((hash[r]−hash[l−1]∗Base^r−l+1)%MOD+MOD)%MOD,(求区间(l,r)字串的哈希值

思路和坑点讲完,上代码

//Compress Words  CF1200E(双字符串哈希+后缀字符串哈希)
#include<stdio.h>
#include<string.h>
long long  mod = 1e8+4,mod2= 1e9+9;
int base = 131, hgf = 377;
char s[1000001], t[1000001];
long long ans[1000001], bns[1000001];//主串的两个哈希数组(双哈希)
long long hj[1000001], hg[1000001];//预处理进制数组
int main()
{int n, k, h, i, j, q;long long f, u;hg[0] = hj[0] = 1;for (i = 1; i <= 1000000; i++)//预处理进制数组{hj[i] = (hj[i - 1] * base) % mod;hg[i] = (hg[i - 1] * hgf) % mod2;}scanf("%d", &n);scanf("%s", t);//先输入第一个串h = strlen(t);for (i = 0; i < h; i++)//求哈希值{ans[i + 1] = (ans[i] * base + t[i]) % mod;bns[i + 1] = (bns[i] * hgf + t[i]) % mod2;}for (i = 2; i <= n; i++){scanf("%s", s);//输入单词k = strlen(s);int ww = 0, flag = 0;//ww记录最大重合的单词数量,flag判断是否有重合long long gf = 0, kg = 0;for (j = 0; j < h && j < k; j++)//从单词的第一个字符开始比较{//输入单词的两个哈希值gf = (gf * base + s[j]) % mod;kg = (kg * hgf + s[j]) % mod2;//主串对应后缀的两个哈希值(O(1)求法,非暴力)f = (gf + ans[h - j - 1] * hj[j + 1]) % mod;u = (kg + bns[h - j - 1] * hg[j + 1]) % mod2;if (f == ans[h] && u == bns[h])//两两对应都相同则存在重合{ww = j; flag = 1;}}if (flag == 1)//如果有重合部分ww++;for (j = ww; j < k; j++)//重合部分后面的连接到主串后面并计算哈希值{t[h++] = s[j];ans[h] = (ans[h - 1] * base + s[j]) % mod;bns[h] = (bns[h - 1] * hgf + s[j]) % mod2;}t[h] = '\0';}printf("%s", t);//输出答案return 0;
}

本题写了3~4个小时,看了题解,虽说花费的时间多,但更进一步了解了进制哈希,双哈希和O(1)方式求子串哈希的方法,还是有收获的

相关文章:

CF1200E Compress Words

题目描述 Amugae has a sentence consisting of n words. He want to compress this sentence into one word. Amugae doesnt like repetitions, so when he merges two words into one word, he removes the longest prefix of the second word that coincides with a suffix…...

ip https证书推荐

公网IP地址是每个连接到互联网的设备所必需的标识。公网IP地址是用于在互联网上唯一标识一个设备的IP地址&#xff0c;它由一组由四个数字组成的字符串组成&#xff0c;每个数字在0到255之间。随着互联网的发展&#xff0c;只有公网IP地址的站点也开始重视传输信息安全&#xf…...

大气颗粒物与VOCs PMF源解析技术应用

目前&#xff0c;大气颗粒物和臭氧污染成为我国亟待解决的环境问题。颗粒物和臭氧污染不仅对气候和环境有重要影响&#xff0c;而且对人体健康有严重损害。而臭氧的前体物之一为挥发性有机物&#xff08;VOCs&#xff09;。为了高效、精准地治理区域大气颗粒物和臭氧污染&#…...

VSCODE中使用Vue3教程

VUE介绍 Vue.js is a popular JavaScript library for building web application user interfaces and Visual Studio Code has built-in support for the Vue.js building blocks of HTML, CSS, and JavaScript. For a richer Vue.js development environment, you can insta…...

Mac M2芯片配置PHP环境

Mac M2芯片配置PHP环境 1. XAMPP2. PHPBrew(PHP版本管理)安装php7.4.33版本 3. 直接使用homebrew 安装php环境参考 1. XAMPP 官网地址 https://www.apachefriends.org/ 安装 安装完成 web server打开后&#xff0c;在打开localhost 成功&#xff01; 2. PHPBrew(PHP版本管…...

[嵌入式系统-25]:RT-Thread -12- 内核组件编程接口 - 网络组件 - HTTP编程

目录 一、HTTP编程概述 1.1 概述 1.2 HTTP 服务器和 HTTP 客户端 二、HTTP Client 2.1 如何配置HTTP Client 2.2 HTTP Client代码实例1&#xff1a;socket发送http报文 2.3 HTTP Client代码实例2&#xff1a;httpc_xx接口收发HTTP报文 2.3.1 接口函数描述 2.3.2 代码实…...

一个服务器实现本机服务互联网化

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 一个服务器实现本机服务互联网化 前言痛点关于中微子代理实战演练搭建服务端搭建客户端服务端配置代理实现 前言 在数字世界的网络战场上&#xff0c;中微子代理就像是一支潜伏在黑暗中的数字特工队&…...

django配置视图并与模版进行数据交互

目录 安装django 创建一个django项目 项目结构 创建视图层views.py 写入视图函数 创建对应视图的路由 创建模版层 配置项目中的模版路径 创建模版html文件 启动项目 浏览器访问结果 安装django pip install django 创建一个django项目 这里最好用命令行完成&#xf…...

Java进阶

乐观锁和悲观锁分布式锁hashmap原理Redis及其分布式DDD领域驱动设计IO、多线程 ??Kafka ??设计模式之&#xff1f;&#xff1f;Elasticsearch ??JVM ?? 面试题汇总1...

⭐北邮复试刷题106. 从中序与后序遍历序列构造二叉树__递归分治 (力扣每日一题)

106. 从中序与后序遍历序列构造二叉树 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7], postor…...

K8S更新部署docker的两种方法举例

前提条件 imagePullPolicy: Always 方法1&#xff1a;删除更新法 test-project为命名空间 --删除所有asp-svc下面的pod,这会导致从新拉取镜像 kubectl delete pods -l appasp-svc -n test-project --删除指定的pod&#xff0c;这会导致从新拉取镜像 kubectl delete pod …...

Java高并发编程基础之Thread构造函数大有内涵

引言 在Java中&#xff0c;Thread类提供了许多丰富的构造函数&#xff0c;以便于创建和管理线程。使得可以根据具体需求来创建和配置线程对象&#xff0c;从而实现更灵活、可扩展的多线程编程。 Thread类的无参构造函数可以创建一个新的线程对象&#xff0c;然后通过调用star…...

2023年12月 Python(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,共50分) 第1题 运行以下程序,输出的结果是?( ) class A():def __init__(self,x):self.x=x...

代码随想录算法训练营第一天

● 今日学习的文章链接和视频链接 ● 自己看到题目的第一想法 1. 704二分法&#xff1a; 方法一&#xff1a; 整个数组是 左闭右闭区间 [ ] left指针指向数组开始下标&#xff0c; right 指针指向数组最后下表nums.size()-1, mid为 (leftright) /2循环条件 left<rightnu…...

基于 java springboot+layui仓库管理系统

基于 java springbootlayui仓库管理系统设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获取源…...

电商平台商家结算

本文主要分析了目前电商清结算的流程以及自己对电商清结算的看法。 基本概念 先说下电商平台清结算的概念。简单说就是收的用户&#xff08;C端&#xff09;的付款&#xff0c;经过清分&#xff0c;再结算给对应商家。当然&#xff0c;这里排除那种资金不通过第三方&#xff0c…...

AIGC 实战:如何使用 Docker 在 Ollama 上离线运行大模型(LLM)

Ollama简介 Ollama 是一个开源平台&#xff0c;用于管理和运行各种大型语言模型 (LLM)&#xff0c;例如 Llama 2、Mistral 和 Tinyllama。它提供命令行界面 (CLI) 用于安装、模型管理和交互。您可以使用 Ollama 根据您的需求下载、加载和运行不同的 LLM 模型。 Docker简介 D…...

MII、RMII、GMII和RGMII,以太网接口中常见的几种标准接口

MII、RMII、GMII和RGMII是以太网接口中常见的几种标准接口&#xff0c;它们在硬件设计中有各自的特点和注意事项。 MII&#xff08;Media Independent Interface&#xff09;&#xff1a;MII是一种传统的以太网物理层接口标准&#xff0c;它包括4位数据总线、时钟和控制信号。…...

SpringCloudConfig+SpringCloudBus+Actuator+Git实现Eureka关键配置属性热更新(全程不重启服务)

文章目录 前言1.痛点2.解决方案3.具体实现3.1搭建热配置服务3.2编写配置文件3.3搭建版本控制仓库3.4Eureka-Client引入以下依赖3.5Eureka-Client微服务编写以下配置bootstrap.yml提前加载3.6分别编写测试Controller3.7测试效果3.8下线场景压测 4.SpringCloudBus优化5.写到最后 …...

郑州大学2024年寒假训练 Day7:数论

感觉这一块讲的有点太少了&#xff0c;只有辗转相除法&#xff0c;拓展欧几里得定理&#xff0c;素数筛&#xff0c;快速幂和逆元五个内容。数论的内容远远不止这些。不过一个视频也讲不了太多东西&#xff0c;讲的还是数学&#xff0c;也是没有办法。一边看题一边说吧。 辗转…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...