题面

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. BZOJ4503: 两个串(bitset字符串匹配)

    题意 题目链接 Sol Orz xudyh F个毛T啊..直接bitset一波就赢了啊...(虽然复杂度很假) 就是记录匹配串中每个元素出现的位置,将第\(i\)个位置的bitset右移\(i\)位后 ...

  2. [转]QT 4.8 静态库编译方法

    最最初踏上QT之路是受到了XiaomaGee的指点,相比于常规的窗口程序开发,QT有着以下特点: 1. 优良的跨平台特性(支持Win.Linux.Mac 不同的平台下只需重新编译即可使用) 2. 面向 ...

  3. Design Pattern ->Composite

    Layering & Contract Philosophy With additional indirection class CComponent { ; ; ; public: virt ...

  4. Android SQLite数据库之事务的学习

    SQLite是Android系统内置的一款轻量级的关系型数据库,它的运算速度非常快,占用资源很少,通常只需要几百K的内存就足够了.SQLite不仅支持标准的SQL语法,还遵循了数据库的ACID事务. ...

  5. js关于cookie的各种方法

    //删除cookiedelCookie("GroupName");//s20是代表20秒//h是指小时,如12小时则是:h12//d是天数,30天则:d30setCookie(&q ...

  6. 初识Python(四)

    一.数字数据类型 Python的数字数据类型用于存储数值,它是不可变的数据类型,这意味着改变数字数据类型,则需要一个新分配的对象: Python支持四种不同的数值类型: 整型(Int):通常被称为是整 ...

  7. PHP:如果正确加载js、css、images等静态文件

    日常中,我们想要把一些静态页面放在框架上或者是进行转移时,那么静态页面上的原url加载js.css.images都会失效,那么我们应该怎么进行修改捏? 现在仓鼠做个笔记哈 这里有几个注意项: 1.路径 ...

  8. windows server 安装之后需要做的操作

    一.运行windows update安装更新 提示: 若一直停留在“正在检查更新”,请参考https://answers.microsoft.com/zh-hans/windows/forum/win ...

  9. 如何处理Eclipse错误消息 The declared package does not match the expected package

    我从github下载了一个开源项目后,导入到自己Eclipse之后,遇到了这个烦人的错误消息: The declared package "com.sap.smartService" ...

  10. mm struct与pgd

    假如该vm_area_struct描述的是一个文件映射的虚存空间,成员vm_file便指向被映射的文件的file结构,vm_pgoff是该虚存空间起始地址在vm_file文件里面的文件偏移,单位为物理 ...