题面

Description

给你一个字符串,它是由某个字符串不断自我连接形成的。 但是这个字符串是不确定的,现在只想知道它的最短长度是多少。

Input

第一行给出字符串的长度,\(1 < L \le 1,000,000\). 第二行给出一个字符串,全由小写字母组成。

Output

输出最短的长度。

SampleInput

  1. 8
  2. cabcabca

SampleOutput

  1. 3

Hint

对于样例,我们可以利用"abc"不断自我连接得到"abcabcabc",读入的cabcabca,是它的子串。


首先让我们来研究一下结果的含义。

不妨设结果为串\(T\)。 则原串为:

我们怎样利用起KMP中的nxt数组呢?

由于\(T\)串是最小循环子串,所以可以标出KMP中\(nxt[n]\)(n为\(|A|\))为:

结果为n-nxt[n]!但是为什么呢?

如果T不是最小循环子串的话,nxt[n]必定还可以再加长

否则,\(nxt[n]\)若再往左边扩展,不妨设增长的为\(T2\),剩下的\(T1\),分两种情况讨论。

1.\(|T1|>=|T2|\)

将两个串对齐可得:



若两串匹配,则显然可得\(T2\)是\(T1\)的前缀,即\(T1=T2+R\),且\(R\)也是\(T1\)的前缀,余下的为\(T2\),即\(T1=R+T2\),则显然\(T1\)是比\(T\)更小的循环子串,与前设矛盾

故两串必定不匹配。


2.\(|T1|<|T2|\)

将两个串对齐可得:

同理。

若两串匹配,则显然可得\(T1\)是\(T2\)的前缀,即\(T2=T1+R\),且\(R\)也是\(T2\)的前缀,余下的为\(T1\),即\(T2=R+T1\),则显然\(T2\)是比\(T\)更小的循环子串,与前设矛盾

故两串必定不匹配。

这样一来,我们就证明了答案为\(n-nxt[n]\)!

然后就可以直接套KMP模板了。

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. using namespace std;
  5. int nxt[1000001],n;
  6. char a[1000001];
  7. int main(){
  8. scanf("%d%s",&n,a);
  9. int k=0;
  10. for(int i=2;i<=n;i++){
  11. while(k&&a[k]!=a[i-1])k=nxt[k];
  12. if(a[k]==a[i-1])k++;
  13. nxt[i]=k;
  14. }
  15. printf("%d\n",n-nxt[n]);
  16. }

[KMP][BZOJ1355][Baltic2009]Radio Transmission的更多相关文章

  1. bzoj1355: [Baltic2009]Radio Transmission

    将原串看成是循环节的后缀加上若干个循环节,那么考虑每种情况都会发现n-next[n]就是最小循环节.(一开始总输出n...然后发现build_next连调用都没有,%%% #include<cs ...

  2. BZOJ1355: [Baltic2009]Radio Transmission KMP

    Description 给你一个字符串,它是由某个字符串不断自我连接形成的. 但是这个字符串是不确定的,现在只想知道它的最短长度是多少. Input 第一行给出字符串的长度,1 < L ≤ 1, ...

  3. 【kmp算法】bzoj1355 [Baltic2009]Radio Transmission

    引用题解:http://blog.csdn.net/wyfcyx_forever/article/details/40347425 #include<cstdio> #include< ...

  4. BZOJ 1355: [Baltic2009]Radio Transmission( kmp )

    自己YY一下可以发现answer =  n - fail[ n ] ------------------------------------------------------------------ ...

  5. BZOJ 1355: [Baltic2009]Radio Transmission [KMP 循环节]

    1355: [Baltic2009]Radio Transmission Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 792  Solved: 535 ...

  6. 1355: [Baltic2009]Radio Transmission[循环节]

    1355: [Baltic2009]Radio Transmission Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 796  Solved: 538 ...

  7. [Baltic2009]Radio Transmission

    bzoj 1355: [Baltic2009]Radio Transmission http://www.lydsy.com/JudgeOnline/problem.php?id=1355 Time ...

  8. BZOJ 1355 Baltic2009 Radio Transmission KMP算法

    标题效果:给定一个字符串,求最小周期节(不能整除) 示例Hint这是错误的忽略了就好了 环路部分应该是cab 这个称号充分利用KMP在next自然阵列,那是,n-next[n]它表示一个循环节 POJ ...

  9. BZOJ1355:[Baltic2009]Radio Transmission

    浅谈\(KMP\):https://www.cnblogs.com/AKMer/p/10438148.html 题目传送门:https://lydsy.com/JudgeOnline/problem. ...

随机推荐

  1. html meta标签实现页面跳转

    refresh用于刷新与跳转(重定向)页面 refresh出现在http-equiv属性中,使用content属性表示刷新或跳转的开始时间与跳转的网址 <!DOCTYPE html> &l ...

  2. EF--payload or not

    负载加载非负载加载适用于多对多场境. 一.非负载(payload-free)加载 1.1创建表 create table Album ( AlbumId ,), AlbumName ) ) creat ...

  3. python模块详解 YAML和configparser

    YAML模块 主要用来做配置文件用的. yaml格式: 详细参考官方文档:PyYAML configparser模块 同样是用于生成和修改配置文件用的.格式和mysql一样. 生成配置文件 impor ...

  4. 时域反射计(TDR)原理与应用

    [施工编辑中...] 1. 什么是TDR? TDR = Time Domain Reflectometry 时域反射计TDR用来测量信号在通过某类传输环境传导时引起的反射,如电路板轨迹.电缆.连接器等 ...

  5. python3绘图示例6-1(基于matplotlib,绘图流程介绍及设置等)

    #!/usr/bin/env python# -*- coding:utf-8 -*- import os import pylab as pyimport numpy as npfrom matpl ...

  6. CentOS-6.5安装配置JDK-7

    安装说明 系统环境:centos-6.5安装方式:rpm安装 软件:jdk-7-linux-x64.rpm下载地址:http://www.oracle.com/technetwork/java/jav ...

  7. shell脚本学习(2)比较两个数字大小

    注意:shell中对比字符串只能使用==.<.>.!=.-z.-n.对比字符串时,末尾一定要加上x(或者a.b等)一个字符,因为if [ $1x == "ab"x ]时 ...

  8. 运用Hadoop能否搭建完整的云计算平台?

    Apache Hadoop 是一个用java语言实现的软件框架,在由大量计算机组成的集群中运行海量数据的分布式计算,它可以让应用程序支持上千个节点和PB级别的数据. Hadoop并不完全代表云计算,所 ...

  9. ffmpeg:编解码过程,基本用法

    1  术语: 什么是影片?其实就是一组(很多张)图片,时间间隔很小的连续展示出来,人们就觉得画面中的人物在动,这就是影片.那电影的实质就是N多张图片的集合.那 每张图片和帧又有什么关系呢?事实上,如果 ...

  10. Python OOP 面向对象

    1.Python实现OOP可以概括为三个概念: 继承:基于Python属性查找 多态:在x.method中,method的意义取决于x的类型 封装:方法和运算符实现行为,数据隐藏是一种惯例 2.委托: ...