题面

Description

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

Input

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

Output

输出最短的长度。

SampleInput

8
cabcabca

SampleOutput

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模板了。

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int nxt[1000001],n;
char a[1000001];
int main(){
scanf("%d%s",&n,a);
int k=0;
for(int i=2;i<=n;i++){
while(k&&a[k]!=a[i-1])k=nxt[k];
if(a[k]==a[i-1])k++;
nxt[i]=k;
}
printf("%d\n",n-nxt[n]);
}

[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. vue-计算属性不能直接修改

    今天在开发的时候,遇到一个问题: 数据如下: data(){ queryCouponList : [] // 通过接口,会更新该数据 } , computed : { couponList () { ...

  2. APK加固之静态脱壳机编写入门

    目录: 0x00APK加固简介与静态脱壳机的编写思路 1.大家都知道Android中的程序反编译比较简单,辛苦开发出一个APK轻易被人反编译了,所以现在就有很多APK加固的第三方平台,比如爱加密和梆梆 ...

  3. win2008 配置TLS1.2

    配置TLS1.2 提供两种方法, 选择其中一种就行了 1.手动设置 找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProv ...

  4. IOS 数据加密总结(及MD5加密)

    数据安全总结 1.网络数据加密1> 加密对象:隐私数据,比如密码.银行信息2> 加密方案* 提交隐私数据,必须用POST请求* 使用加密算法对隐私数据进行加密,比如MD53> 加密增 ...

  5. windows/Linux主机重启NetBackup服务和后台进程

    关闭并启动所有NetBackup服务和后台进程 要关闭并启动所有NetBackup服务和后台驻留程序,请从命令行输入以下命令: 在Windows上: 要关闭所有NetBackup服务: install ...

  6. Java从入门到放弃——04.数组

    本文目标 数组 1.数组 定义一个数组的三个姿势: 数组类型 []    数组名  =   new   数组类型[数组数量]: 数组类型 []    数组名  =   new   数组类型[]{对象1 ...

  7. python 面向对象(二)--访问限制

    在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑. 但是,从前面Student类的定义来看,外部代码还是可以自由地修改一个实例的na ...

  8. override与重载的区别

    override与重载的区别override 与重载的区别,重载是方法的名称相同.参数或参数类型不同,进行多次重载以适应不同的需要 Override 是进行基类中函数的重写.

  9. css3 子元素的的应用 注意点

    已经第二次犯错误,不允许有下次 <ul class="ul"> <li> <a>哈哈</a> </li> <li& ...

  10. 遗忘的html标签

    <span>x</span><sup>2</sup><span>+y=10</span> <br> <span ...