POI2012 PRE-Prefixuffix

2023-12-22 06:15
文章标签 pre poi2012 prefixuffix

本文主要是介绍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;
}

这篇关于POI2012 PRE-Prefixuffix的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/522845

相关文章

Vue内置指令v-once、v-memo和v-pre提升性能?

前言 Vue的内置指令估计大家都用过不少,例如v-for、v-if之类的就是最常用的内置指令,但今天给大家介绍几个平时用的比较少的内置指令。毕竟这几个Vue内置指令可用可不用,不用的时候系统正常跑,但在对的地方用了却能提升系统性能,下面将结合示例进行详细说明。 一、v-once 作用:在标签上使用v-once能使元素或者表达式只渲染一次。首次渲染之后,后面数据再发生变化时使用了v-once的

How to leverage pre-trained multimodal model?

However, embodied experience is limited inreal world and robot. How to leverage pre-trained multimodal model? https://come-robot.github.io/

petalinux,Zynq UltraScale+ MPSoC;WARNING: Failed to load PMUFW, doesn't exist in pre-built.

petalinux-package --pmufw ./images/linux/pmufw.elf 这个参数貌似没有生效; 解决办法: cp images/linux/pmufw.elf ./pre-built/linux/images/

如果一个函数func定义在namespace sggk::test中,pre类定义在namespace sggk中,那么func能否调用类pre

在C++中,如果一个函数func定义在命名空间sggk::test中,而类pre定义在命名空间sggk中,那么func函数可以调用pre类,但需要通过适当的命名空间解析来访问它。   有几种方式可以实现这一点:   使用完全限定名:在func函数内部,你可以直接使用sggk::pre来引用pre类。这是最直接且明确的方式,因为它完全指定了pre类所在的命名空间。   cpp name

一文彻底搞懂Fine-tuning - 预训练和微调(Pre-training vs Fine-tuning)

Pre-training vs Fine-tuning 预训练(Pre-training)是预先在大量数据上训练模型以学习通用特征,而微调(Fine-tuning)是在特定任务的小数据集上微调预训练模型以优化性能。 Pre-training vs Fine-tuning 为什么需要预训练? 预训练是为了让模型在见到特定任务数据之前,先通过学习大量通用数据来捕获广泛有用的特征,从而

cookie-editor插件、Vue的内置指令(v-text、v-html、v-cloak、v-once、v-pre)、自定义指令

目录 1. cookie-editor插件2. v-text3. v-html4. v-cloak5. v-once6. v-pre7. 自定义指令7.1 简单自定义指令7.2 复杂自定义指令 1. cookie-editor插件 可以在谷歌浏览器和火狐浏览器安装cookie-editor插件 在谷歌浏览器,点击Export就可以将谷歌浏览器的所有Cookie复制到粘贴板

Large-Scale Relation Learning for Question Answering over Knowledge Bases with Pre-trained Langu论文笔记

文章目录 一. 简介1.知识库问答(KBQA)介绍2.知识库问答(KBQA)的主要挑战3.以往方案4.本文方法 二. 方法问题定义:BERT for KBQA关系学习(Relation Learning)的辅助任务 三. 实验1. 数据集2. Baselines3. Metrics4.Main Results 一. 简介 1.知识库问答(KBQA)介绍 知识库问答(KBQA

ajax返回Json数据中带有<pre>标签去除

某个文件上传ajax取值出问题就很纳闷 于是打印了返回的信息发现json被 <pre style="word-wrap: break-word; white-space: pre-wrap;">{json}</pre> 完完整整的包裹着,不出错才奇怪。 于是为了解决这问题尝试了网上说的一些办法,几乎都没效果,最后还是正则解决了。 记录下吧,可能每个人的情况不一样。 1.将返回的类型从a

8.20 pre day bug

pre-bug1 分号省略 这些语句的分隔规则会导致一些意想不到的情形,如以下的一个示例; let m = n + f(b+c).toString() 但该语句最终会被解析为: let m = n + f(a+b).toString(); returntrue 一定会被解析成 return;true; pre-bug2 Math.random()与Math.fl

8.19 day pre-bug

pre-bug 实在没bug了,只能改成prevent-bug,预防bug 今天复习了很多sql的部分,还有很多没POST上来,果真是 Periodic Table Database ALTER TABLE properties RENAME COLUMN weight TO atomic_mass; ALTER TABLE properties RENAME COLUMN meltin