Educational Codeforces Round 159(div2) --- E. Collapsing Strings-- 题解

目录

E. Collapsing Strings

题目大意:

思路:

代码:


E. Collapsing Strings

Problem - E - Codeforces

题目大意:

给你n个字符串,然后对任意两个字符串进行合并操作,

设两个字符串 a 和 b 的折叠 C(a,b) 是以下操作:

  • 如果 a 为空,则 C(a,b)=b;
  • 如果 b 为空,则 C(a,b)=a;
  • 如果 a 的最后一个字母等于 b 的第一个字母,则 C(a,b)=C(a1,|a|−1,b2,|b|) ,其中 sl,r是 s 的子字符串,从  第l 个字母到 第r 个字母;
  • 否则为 C(a,b)=a+b ,即两个字符串的串联。

然后计算任意两个字符串合并后的长度和。

n <= 10^6, |s| <= 10^6 并且总的字符串长度为10^6

思路:

即如果两个字符串的前缀和后缀相同,应该将这部分相同的前缀和后缀去掉(就是消消乐),然后他们剩下的字符串长度就是答案。

如果暴力求的话复杂度是len * n * n为10^18的次方,这是不能接受的,所以需要进行预处理,将部分相同的前缀和后缀全部去掉这一件事其实可以看作是寻找前缀匹配长度,如果有匹配需要删除此部分贡献的答案。

所以可以构建一个前缀树,然后在匹配时,将每一个字符串倒序,后缀就变成了前缀,便可以利用这个已经构造后的前缀树快速得到答案。

for (int i = 1; i <= n; i++) {str[i] = input.next();build(str[i]); // 构建前缀树sum += str[i].length();}sum *= 2L * n; // 如果没有任意一对字符串可以匹配时的答案。for (int i = 1; i <= n; i++) {for (int j = 0; j <= str[i].length(); j++) ans[j] = 0;query(str[i]); // for (int j = str[i].length() - 1; j >= 0; j--) {// 将拥有相同前缀和后缀的答案进行删除sum -= 2L * (j + 1) * (ans[j] - ans[j + 1]); }}
public static void build(String str){char[] s = str.toCharArray();int p = 0;for (int i = 0; i < s.length; i++) {int j = s[i] - 'a';if (tree[p][j] == 0) tree[p][j] = ++idx;p = tree[p][j];cnt[p]++;}}public static void query(String str){char[] s = str.toCharArray();int p = 0;for (int i = 0; i < s.length; i++) {int k = str.length() - i - 1; // 使用对应编号,这里相当于是对逆序的优化int j = s[k] - 'a';if (tree[p][j] == 0) return; // 如果当前位置没有匹配的前缀,退出p = tree[p][j]; ans[i] = cnt[p]; // 拥有匹配相同前缀的字符串个数}}

代码:

import java.util.Scanner;/*** @ProjectName: study3* @FileName: Ex41* @author:HWJ* @Data: 2023/12/4 19:48*/
public class Ex41 {static int N = (int) (1e6 + 6);static int[] cnt = new int[N];static int[][] tree = new int[N][30];static long[] ans = new long[N];static String[] str = new String[N];static int idx = 0;public static void main(String[] args) {Scanner input = new Scanner(System.in);int n = input.nextInt();long sum = 0;for (int i = 1; i <= n; i++) {str[i] = input.next();build(str[i]);sum += str[i].length();}sum *= 2L * n;for (int i = 1; i <= n; i++) {for (int j = 0; j <= str[i].length(); j++) ans[j] = 0;query(str[i]);for (int j = str[i].length() - 1; j >= 0; j--) {sum -= 2L * (j + 1) * (ans[j] - ans[j + 1]);}}System.out.println(sum);}public static void build(String str){char[] s = str.toCharArray();int p = 0;for (int i = 0; i < s.length; i++) {int j = s[i] - 'a';if (tree[p][j] == 0) tree[p][j] = ++idx;p = tree[p][j];cnt[p]++;}}public static void query(String str){char[] s = str.toCharArray();int p = 0;for (int i = 0; i < s.length; i++) {int k = str.length() - i - 1;int j = s[k] - 'a';if (tree[p][j] == 0) return;p = tree[p][j];ans[i] = cnt[p];}}
}

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

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

相关文章

中危漏洞!小程序优惠卷遍历

进入小程序&#xff0c;因为是一个小商城&#xff0c;所以照例先查看收货地址是否存在越权&#xff0c;以及能否未授权访问&#xff0c;但是发现不存在这些问题&#xff0c;所以去查看优惠卷 进入领券中心&#xff0c;点击领取优惠券时抓包 发现数据包&#xff0c;存在敏感参数…

DevEco Studio将常用内容设为代码模板 通过快捷键调出

有时候 我们开发 可能有一些经常要写的内容 天天CV大法找东西也非常麻烦 我们这里打开编辑器 选择 File下的Settings 打开设置界面 选择 Editor 下的 Live Templates 模板 然后 我们点击右侧加号 然后点第一个 加一个 这里 我们设置 输入 em时会触发提示 内容时 问君能有几…

使用Serv-U FTP服务器共享文件,实现无公网IP环境下远程访问

文章目录 1. 前言2. 本地FTP搭建2.1 Serv-U下载和安装2.2 Serv-U共享网页测试2.3 Cpolar下载和安装 3. 本地FTP发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 科技日益发展的今天&#xff0c;移动电子设备似乎成了我们生活的主角&#xff0c;智能…

每日一题(LeetCode)----字符串--反转字符串

每日一题(LeetCode)----字符串–反转字符串 1.题目&#xff08;344. 反转字符串&#xff09; 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) …

网盘系统设计:万亿 GB 网盘如何实现秒传与限速?

Java全能学习面试指南&#xff1a;https://javaxiaobear.cn 网盘&#xff0c;又称云盘&#xff0c;是提供文件托管和文件上传、下载服务的网站&#xff08;File hostingservice&#xff09;。人们通过网盘保管自己拍摄的照片、视频&#xff0c;通过网盘和他人共享文件&#xff…

C++进阶篇6---lambda表达式

目录 一、lambda表达式 1.引入 2、lambda表达式语法 二、包装器---function 1.引入 2.包装器介绍 三、bind 一、lambda表达式 1.引入 class Person { public:Person(int age,string name):_age(age),_name(name){} //private://方便后面的举例int _age;string _name…

CAN总线负载率

总线负载率就是每秒钟传输了多少个位&#xff0c;波特率为500K的总线上每秒钟能够传输500‘000位&#xff0c;如果在某一秒中总线上只传输了100000位&#xff0c;则总线负载率为20%。 总线负载率 总线每秒上传输的实际位数 / 总线波特率 * 100% CAN总线负载率是CAN总线架构协…

JS生成登录验证码

采用js生成登录的验证码 采用的技术点有html&#xff0c;css&#xff0c;JS&#xff0c;jQuery HTML&#xff1a; <div class"box_b"><img src"./img/0775639c-c82c-4a29-937f-d2a3bae5151a.png" alt""><div class"regist…

智能变压器监控系统

智能变压器监控系统是一种先进的物联网技术和智能设备&#xff0c;能够实现对变压器的实时监测和管理&#xff0c;提高变压器的运行效率和可靠性&#xff0c;为用户提供及时、准确的变压器运行状态信息和故障预警。 力安科技A30变压器云控终端是一款集变压器温控仪、变压器运行…

LabVIEW开发工业设备远程在线状态监测

LabVIEW开发工业设备远程在线状态监测 项目需要减少意外停机和维护费用、提供更完整的机器操作和状态图、改进设备使用情况跟踪。 该解决方案是一个多节点&#xff08;即多站点&#xff09;远程监控系统&#xff0c;它利用了基于NI cRIO的控制器和定制的LabVIEW监测软件。 方…

【Lustre相关】应用部署-03-Lustre集群部署实践(软raid方案)

文章目录 一、前言1、硬件配置2、组网拓扑3、总体方案 二、软件安装三、集群部署1、配置多路径2、配置高可用集群3、配置zpool4、部署lustre5、配置Lustre角色高可用6、配置Lustre状态监控6.1、Lustre网络状态监控6.2、Lustre集群状态监控6.3、配置优化6.3.1、设置故障恢复不回…

不同数据库进行同步和增量数据(SQL server 与MySQL数据库为例)

场景 最近在做的一个项目需要将远程服务器的SQL server数据库中表的数据传输到本机的MySQL数据库中&#xff0c;并且远程的SQL server数据库表的数据会实时进行更新&#xff0c;并且差不多是一分钟内传输18条数据&#xff0c;例如现在是2023-12-4 15:09&#xff0c;在15:08这个…

JDK安装太麻烦?一篇文章搞定

JDK是 Java 语言的软件开发工具包&#xff0c;主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心&#xff0c;它包含了JAVA的运行环境&#xff08;JVMJava系统类库&#xff09;和JAVA工具。 JDK包含的基本组件包括&#xff1a; javac – 编译器&#xf…

FCRP第二题

【题目要求】 数据库中有一张地区数据统计表&#xff0c;但是并不规则 &#xff0c;记录类似于&#xff0c;225100:02:3:20160725是一串代码&#xff0c;以&#xff1a;分割&#xff0c;第1位为地区代码&#xff0c;第2位为分类代码&#xff0c;第3位为数量&#xff0c;第4位为…

X540t2关于手动安装intel驱动

首先去intel驱动官网下载&#xff0c;win10和win11驱动一样 https://www.intel.cn/content/www/cn/zh/download/18293/intel-network-adapter-driver-for-windows-10.html 然后下载下来解压 将Wired_driver_28.2_x64.exe修改成Wired_driver_28.2_x64.zip文件再解压 打开设备管…

【算法思考记录】力扣1094.拼车 C++【树状数组】

拼车问题&#xff08;LeetCode 1094&#xff09;的解析与C实现 Problem: 1094. 拼车 题目背景 在本题中&#xff0c;我们需要处理一个拼车的问题。假设一辆车有固定的座位容量&#xff0c;我们需要根据乘客的上车和下车地点&#xff0c;判断车辆是否能够在整个行程中满足不超过…

DPDK驱动加载

目录 整体加载思路 配置步骤 全局变量配置 调用流程编写 加载VFIO模块 删除VFIO模块 加载KNI模块 卸载KNI模块 创建大页内存 创建大页内存文件系统 删除遗留的大页内存 卸载大页文件系统 调用dpdk-devbind.py脚本来绑定PCI设备igb_uio驱动 加载igb_uio.ko驱动. 卸…

基于springboot + vue 学生网上请假系统

qq&#xff08;2829419543&#xff09;获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;springboot 前端&#xff1a;采用vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xf…

GeoServer本地部署与远程访问Web管理页面——“cpolar内网穿透”

文章目录 前言1.安装GeoServer2. windows 安装 cpolar3. 创建公网访问地址4. 公网访问Geo Servcer服务5. 固定公网HTTP地址 前言 GeoServer是OGC Web服务器规范的J2EE实现&#xff0c;利用GeoServer可以方便地发布地图数据&#xff0c;允许用户对要素数据进行更新、删除、插入…

(C语言)求出1,2,5三个数不同个数组合为100的组合个数

#include<stdio.h> int main() {int count;for(int i 0;i < 100;i )for(int j 0;j < 50;j )for(int k 0;k < 20;k ){if(i j*2 k*5 100){count;printf("100可以拆分为%d个1元&#xff0c;%d个2元&#xff0c;%d个5元\n",i,j,k);} }printf("…