POI2012 PRE-Prefixuffix

P3546 [POI2012] PRE-Prefixuffix

题目大意

对于两个字符串 S 1 , S 2 S_1,S_2 S1,S2,如果将 S 1 S_1 S1的一个后缀移动到开头后这个字符串变成了 S 2 S_2 S2,则称 S 1 , S 2 S_1,S_2 S1,S2循环同构。

给定一个长度为 n n n的字符串 S S S,求满足下面条件的最大的 L L L

  • L L L不超过 n 2 \dfrac n2 2n
  • S S S长度为 L L L的前缀和 S S S长度为 L L L的后缀循环等价

1 ≤ n ≤ 1 0 6 1\leq n\leq 10^6 1n106


题解

题目要求的就是形如下面这样的前后缀,其中红色部分相同,绿色部分相同。
在这里插入图片描述
判断两个字符串相同可以用哈希。对于每个位置 i i i,我们用 f i f_i fi表示满足以下条件的的最大的 k k k

  • [ i , i + k − 1 ] = [ n − i − k + 2 , n − i + 1 ] [i,i+k-1]=[n-i-k+2,n-i+1] [i,i+k1]=[nik+2,ni+1]
  • i + k − 1 ≤ n 2 i+k-1\leq \dfrac n2 i+k12n

如果通过枚举 k k k来求每个 f i f_i fi的话,时间复杂度是 O ( n 2 ) O(n^2) O(n2)的,我们考虑优化。

我们发现, f i − 1 ≤ f i + 2 f_{i-1}\leq f_i+2 fi1fi+2,证明如下:

假设 f i − 1 > f i + 2 f_{i-1}>f_i+2 fi1>fi+2,因为 f i − 1 f_{i-1} fi1 f i f_i fi多了 i − 1 i-1 i1这个位置,如果将 f i − 1 f_{i-1} fi1对应的绿色部分的第一个字符和最后一个字符去掉,那么一定符合 f i f_i fi的条件,也就是说 f i f_i fi至少为 f i − 1 − 2 f_{i-1}-2 fi12,推得 f i − 1 ≤ f i + 2 f_{i-1}\leq f_i+2 fi1fi+2,与 f i − 1 > f i + 2 f_{i-1}>f_i+2 fi1>fi+2矛盾,得证 f i − 1 ≤ f i + 2 f_{i-1}\leq f_i+2 fi1fi+2

根据这个条件,我们可以 O ( n ) O(n) O(n)求出所有 f i f_i fi

然后,对于每个 i i i,判断 [ 1 , i ] [1,i] [1,i] [ n − i + 1 , n ] [n-i+1,n] [ni+1,n]是否相同,如果相同就用 i + f i − 1 i+f_i-1 i+fi1更新答案。

时间复杂度为 O ( n ) O(n) O(n)

code

#include<bits/stdc++.h>
using namespace std;
const int base=233;
const long long mod=1e9+7;
const int N=1000000;
int n,ans=0,f[N+5];
long long pw[N+5],g[N+5];
char s[N+5];
long long gt(int l,int r){
	return (g[r]-g[l-1]*pw[r-l+1]%mod+mod)%mod;
}
int main()
{
	scanf("%d",&n);
	scanf("%s",s+1);
	pw[0]=1;
	for(int i=1;i<=n;i++){
		g[i]=(g[i-1]*base+s[i]-'a'+1)%mod;
		pw[i]=pw[i-1]*base%mod;
	}
	for(int i=n/2;i>=1;i--){
		f[i]=min(f[i+1]+2,n/2-i+1);
		while(f[i]>0&&gt(i,i+f[i]-1)!=gt(n-i-f[i]+2,n-i+1)) --f[i];
	}
	for(int i=1;i<=n/2;i++){
		if(gt(1,i-1)==gt(n-i+2,n)) ans=max(ans,i+f[i]-1);
	}
	printf("%d",ans);
	return 0;
}

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

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

相关文章

Android Studio打包有哪些优势

大家好&#xff0c;现在移动应用程序的快速发展&#xff0c;开发者需要一个强大又可靠的开发环境来创建和打包高质量的 Android 应用程序。Android Studio 是一款由 Google 官方开发的 Android 应用程序开发环境&#xff0c;提供了许多的优势和便利&#xff0c;那究竟都有哪些优…

【Eachrts】水滴图

引入依赖 npm安装echarts、echarts-liquidfill插件 "echarts": "^5.4.2", "echarts-liquidfill": "^3.1.0",引入插件 import * as echarts from echarts; import echarts-liquidfill;示例 <template><div class"Liqu…

软件设计模式:六大设计原则

文章目录 前言一、开闭原则二、里氏替换原则三、依赖倒转原则四、接口隔离五、迪米特法则六、合成复用原则总结 前言 在软件开发中&#xff0c;为了提高软件系统的可维护性和可复用性&#xff0c;增加软件的可扩展性和灵活性&#xff0c;程序员要尽量根据6条原则来开发程序&am…

Docker 文件和卷 权限拒绝

一 创作背景 再复制Docker影像文件或访问Docker容器内已安装卷上的文件时我们常常会遇到&#xff1a;“权限被拒绝”的错误&#xff0c;在此&#xff0c;您将了解到为什么会出现“权限被拒绝”的错误以及如何解决这个问题。 二 目的 在深入探讨 Docker 容器中的 Permission De…

Java8新特性 Stream

首先创建一个用户的实体类&#xff0c;包括姓名、年龄、性别、地址、赏金 几个属性 Data public class User {//姓名private String name;//年龄private Integer age;//性别private Integer sex;//地址private String address;//赏金private BigDecimal money;public User(St…

2023一整年BurpSuit都更新了什么?

2023一整年BurpSuit都更新了什么&#xff1f; 2023.5之前除了引入了montoya的外&#xff0c;其他基本都属于优化&#xff0c;不统计了。 历史版本地址&#xff1a;https://portswigger.net/burp/releases/archive?y2023 2023.5 Organizer Notes Live crawl paths view 2023.6 …

如何使用Docker搭建青龙面板并结合内网穿透工具发布至公网可访问

文章目录 一、前期准备本教程环境为&#xff1a;Centos7&#xff0c;可以跑Docker的系统都可以使用。本教程使用Docker部署青龙&#xff0c;如何安装Docker详见&#xff1a; 二、安装青龙面板三、映射本地部署的青龙面板至公网四、使用固定公网地址访问本地部署的青龙面板 正文…

ansible变量的使用

本章主要介绍playbook中的变量 自定义变量使用变量文件字典变量列表变量facts变量内置变量变量的过滤器 为了能够写出更实用的playbook&#xff0c;需要在playbook中使用变量。下面来讲解playbook 中常见的变量。本章实验都在/home/lduan/demo2下操作&#xff0c;先把 demo2目…

【高录用快检索】第四届机械设计与仿真国际学术会议(MDS 2024)

【高录用快检索】第四届机械设计与仿真国际学术会议&#xff08;MDS 2024) 2024 4th International Conference on Mechanical Design and Simulation 2024年第四届机械设计与仿真国际学术会议&#xff08;MDS 2024) 将于2024年03月01-03日在中国西安召开。MDS 2024将围绕“…

一篇文章带你了解SpringBoot目录结构

前言 SpringBoot是整合Spring技术栈的一站式框架&#xff0c;是简化Spring技术栈的快速开发脚手架&#xff0c;是一个能够快速构建生产级别的Spring应用的工具。SpringBoot是目前流行的微服务框架&#xff0c;倡导“约定优于配置”&#xff0c;简化Spring项目搭建及开发过程。…

Ubuntu配置GPU资源

0、升级内核为5.15.0-88-generic&#xff1a; 0.1 配置下载源&#xff1a; 在/etc/apt/sources.list.d目录下新建list文件&#xff0c;添加内容&#xff1a; deb http://mirrors.aliyun.com/ubuntu/ focal-updates amin restricted0.2 下载 sudo apt-get install linux-imag…

中小型教育网络安全解决方案

热门IT技术视频教程&#xff1a;https://xmws-it.blog.csdn.net/article/details/134398330?spm1001.2014.3001.5502 一、中小型教育网络的安全现状及挑战 当前&#xff0c;校园网的安全形势非常严峻&#xff0c;大量的垃圾邮件、黑客攻击、病毒蠕虫等困扰着管理者。而且这些作…

java使用面向对象实现图书管理系统

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

2023年12月21日历史上的今天大事件早读

1375年12月21日 意大利文艺复兴的代表人物薄伽丘逝世 1620年12月21日 英国抵达第一个北美殖民地普利茅斯 1879年12月21日 斯大林出生 1921年12月21日 苏俄电气化计划批准 1928年12月21日 天津劝业场开业 1928年12月21日 中国核化学家王方定出生 1935年12月21日 载客21人的…

飞书+ChatGPT搭建智能AI助手,无公网ip实现公网访问飞书聊天界面

飞书ChatGPT搭建智能AI助手&#xff0c;无公网ip实现公网访问飞书聊天界面 前言环境列表1.飞书设置2.克隆feishu-chatgpt项目3.配置config.yaml文件4.运行feishu-chatgpt项目5.安装cpolar内网穿透6.固定公网地址7.机器人权限配置8.创建版本9.创建测试企业10. 机器人测试 前言 …

qt-C++笔记之app.processEvents()和QApplication::processEvents()的区别

qt-C笔记之app.processEvents()和QApplication::processEvents()的区别 code review! 代码1&#xff1a; QApplication app(argc, argv); app.processEvents(); 代码2: QApplication::processEvents(); 区别 代码1和代码2的区别在于代码1中使用了一个具体的QApplication对…

Java项目的学习记录---12306购票系统的技术架构选型

后端技术架构 选择基于 Spring Boot 3 和 JDK17 进行底层建设 前端技术架构

征集倒计时 | 2023年卓越影响力榜单-第四届中国产业创新奖报名即将截止

第四届「ISIG中国产业智能大会」将于2024年3月16日在上海举办。2024 ISIG 以“与科技共赢&#xff0c;与产业共进”为主题&#xff0c;共设立RPA超自动化、 低代码、AIGC大模型、流程挖掘四大主题峰会。届时&#xff0c;大会组委会将颁发2023年度卓越影响力榜单—第四届中国产业…

动态内存分配(malloc和free​、calloc和realloc​)

目录 一、为什么要有动态内存分配​ 二、C/C中程序内存区域划分​ 三、malloc和free​ 2.1、malloc 2.2、free​ 四、calloc和realloc​ 3.1、calloc​ 3.2、realloc​ 3.3realloc在调整内存空间的是存在两种情况&#xff1a; 3.4realloc有malloc的功能 五、常见的动…

vue proxy代理 和 Nginx 配置跨域

vue.config.js文件中配置的代理&#xff1a; devServer: {port: 9095,// open: true, // 配置项目在启动时自动在浏览器打开proxy: {/yh: { // /api是代理标识&#xff0c;一般是每个接口前的相同部分target: "http://192.168.5.58:8002", // 请求地址&#xff0c;一…