KMP求字符串最小循环节
证明1:
对于一个字符串S,长度为L,如果由长度为len的字符串s(字符串s的最小循环节是其本身)循环k次构成,那么字符串s就是字符串S的最小循环节
那么字符串有个很重要的性质和KMP挂钩,即 i - next[i] 为字符串s的长度 i%(i - next[i]) ==0
证明:字符串S由s循环k次构成,那么有S[0-->L-len-1] == S[len-->L-1],即前k-1个循环节和后k-1个循环节构成的字符串相等
那么此时KMP数组的next[L] = k-1个循环节的长度, 也即 next[L] = L-len-1+1 = L - len,那么此时 L - next[L] = len , 所以 L % len = 0, L % len = k
所以如果字符串存在循环节,那么i % (i - next[i]) ==0,循环节的长度为 i - next[i]
否则,循环节的为字符串本身。
证明2:
t = n-next[n] 为循环节的长度
1、如果next[n]==0,则表示字符串S前后无任何相同的部分,所以字符串S自身为一个循环节,成立
2、如果next[n]!=0 且 字符串S的循环节个数为2
①:如果字符串S是完美(即每个循环节都是完整的)
那么next[n] = n/2 所以 t = n - next[n] = n/2,成立
②:字符串S的循环节个数为2,但是位于左边的循环节是完整的,右边的是残缺的
那么next[n] = 残缺的循环节和完整的循环节的相似长度,所以t = n - next[n]成立
3、如果next[n]!=0 且字符串S的循环节个数k>=3 ,
那么字符串S从第二个循环节开始到最后一个字符(设长度为len)和字符串S从第一个字符串开始的len个字符相等
所以t = n - next[n]成立
hdu1358
求每一个前缀是不是循环串,如果是,输出串长和循环的次数。
#include <stdio.h>
#include <string.h>
const int N = + ;
char str[N];
int next[N];
void makeNext(char *str)
{
int i=,j=-;
next[] = -;
while(str[i])
{
if(j==-||str[i]==str[j])
{
i++;
j++;
next[i] = j;
}
else
j = next[j];
}
}
int main()
{ int n;
int tCase = ;
while(true)
{
scanf("%d",&n);
if(n==)
break;
scanf("%s",str);
makeNext(str);
printf("Test case #%d\n",tCase++);
for(int i=; i<=n; ++i)
{
if(i%(i-next[i])== && next[i]!=)//next[i]!=0,如果为0,循环节是本身
printf("%d %d\n",i,i/(i-next[i])); }
puts(""); }
return ;
}
hdu3746
补多少个字符能形成循环串
#include <stdio.h>
#include <string.h>
const int N = + ; char str[N];
int next[N]; void makeNext()
{
int i = ,j = -;
next[i] = j;
while(str[i])
{
if(j==- || str[i]==str[j])
next[++i] = ++j;
else
j = next[j];
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s",str);
int n = strlen(str);
makeNext();
int t = n - next[n];
if(t!=n && n%t==)
puts("");
else
printf("%d\n",t-(n-n/t*t));
}
return ;
}
KMP求字符串最小循环节的更多相关文章
- hdu 4333"Revolving Digits"(KMP求字符串最小循环节+拓展KMP)
传送门 题意: 此题意很好理解,便不在此赘述: 题解: 解题思路:KMP求字符串最小循环节+拓展KMP ①首先,根据KMP求字符串最小循环节的算法求出字符串s的最小循环节的长度,记为 k: ②根据拓展 ...
- KMP模板,最小循环节
(可以转载,但请注明出处!) 下面是有关学习KMP的参考网站 http://blog.csdn.net/yaochunnian/article/details/7059486 http://blog. ...
- HUST 1010 The Minimum Length (字符串最小循环节)
题意 有一个字符串A,一次次的重写A,会得到一个新的字符串AAAAAAAA.....,现在将这个字符串从中切去一部分得到一个字符串B.例如有一个字符串A="abcdefg".,复制 ...
- POJ--2406Power Strings+KMP求字符串最小周期
题目链接:点击进入 事实上就是KMP算法next数组的简单应用.假设我们设这个字符串的最小周期为x 长度为len,那么由next数组的意义,我们知道len-next[len]的值就会等于x.这就是这个 ...
- POJ2406 Power Strings —— KMP or 后缀数组 最小循环节
题目链接:https://vjudge.net/problem/POJ-2406 Power Strings Time Limit: 3000MS Memory Limit: 65536K Tot ...
- hdu3746(kmp最小循环节)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3746 题意:问在一个字符串末尾加上多少个字符能使得这的字符串首尾相连后能够循环 题解:就是利用next ...
- hdu 3746 Cyclic Nacklace(next数组求最小循环节)
题意:给出一串字符串,可以在字符串的开头的结尾添加字符,求添加最少的字符,使这个字符串是循环的(例如:abcab 在结尾添加1个c变为 abcabc 既可). 思路:求出最小循环节,看总长能不能整除. ...
- HDU3746 Cyclic Nacklace —— KMP 最小循环节
题目链接:https://vjudge.net/problem/HDU-3746 Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others) M ...
- kmp的next数组的运用(求字符串的最小循环节)
hdu3746 Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...
随机推荐
- Data Recovery Advisor(数据恢复顾问)
Data Recovery Advisor 是11g新特性,是Oracle顾问程序架构的一部分,它会在遇到错误时自动收集有关故障信息.如果主动运行Data Recovery Advisor,通常可以在 ...
- windows socket----select模型
一般我们的网络编程都是用bind ,listen,accept,send/sendto,recv/recvfrom.在创建套接字的时候,是默认使用阻塞模式的,每当我们调用send/sendto等方法时 ...
- [UVALive 6663 Count the Regions] (dfs + 离散化)
链接:https://icpcarchive.ecs.baylor.edu/index.php? option=com_onlinejudge&Itemid=8&page=show_p ...
- Mysql iot表
我们知道一般的表都以堆(heap)的形式来组织的,这是无序的组织方式. Oracle还提供了一种有序的表,它就是索引组织表,简称IOT表.IOT表上必须要有主键,而IOT表本身不对应segment,表 ...
- 使用PageHeap.EXE或GFlags.EXE检查内存越界错误
必先利其器之一:使用PageHeap.EXE或GFlags.EXE检查内存越界错误 Article last modified on 2002-6-3 ------------------------ ...
- SilkTest Q&A 6
Q51.GMO在线的问题? 该问题是一个特例,不具有代表性,故不翻译了. Q52.如何为一个testplan的属性定义值? A52:你必须在使用前为一个testplan定义值: 1.确保你的test ...
- javascript --- 事件托付
javascript 之 事件托付 长处:1.提高性能(仅仅须要对父级进行操作,子节点相同会拥有其相关属性和方法) 2.对于新加入的事件.也让其拥有父级事件的属性 <!doctype html& ...
- [C++]C++中的运行时类型检测
Date:2014-1-3 Summary: 使用C++中的运行时类型检测.(文章重点在于记录本人的使用情况,并非深层讨论RTTI) Contents:写习惯C#的我,在C++依然存在哪些.NET的惯 ...
- sort 使用 tab键 作为 分隔符_人生如梦_百度空间
sort 使用 tab键 作为 分隔符_人生如梦_百度空间 sort 使用 tab键 作为 分隔符 For some reason "\t" doesn't work right, ...
- poj 2586 Y2K Accounting Bug(贪心算法,水题一枚)
#include <iostream> using namespace std; /*248K 32MS*/ int main() { int s,d; while(cin>> ...