kmp的最小循环节

kmp的最小循环节

KMP最小循环节、循环周期:

  • 定理:假设S的长度为len,则S存在最小循环节,循环节的长度L为len-next[len],子串为S[0…len-next[len]-1]。
  • (1)如果len可以被len – next[len]整除,则表明字符串S可以完全由循环节循环组成,循环周期T=len/L。
  • (2)如果不能,说明还需要再添加几个字母才能补全。需要补的个数是循环个数L-len%L=L-(len-L)%L=L-next[len]%L,L=len-next[len]。
  • 理解该定理,首先要理解next数组的含义:next[i]表示前面长度为i的子串中,前缀和后缀相等的最大长度

 

抽象的解释参考这个:https://www.cnblogs.com/wuyiqi/archive/2012/01/06/2314078.html

kmp的最小循环节

k    m   x     j     i

由上,next【i】=j,两段红色的字符串相等(两个字符串完全相等),s[k….j]==s[m….i]

设s[x…j]=s[j….i](xj=ji)

则可得,以下简写字符串表达方式

kj=kx+xj;

mi=mj+ji;

因为xj=ji,所以kx=mj,如下图所示

 k   m     a    x    j     i

设s[a…x]=s[x..j](ax=xj)

又由xj=ji,可知ax=xj=ji

即s[a…i]是由s[a…x]循环3次得来的。

而且看到没,此时又重复上述的模型,s[k…x]=s[m…j],可以一直递推下去

最后可以就可以递推出文章开头所说的定理了。

 

最后再举两个相关例子

abdabdab  len:8 next[8]:5

最小循环节长度:3(即abd)   需要补的个数是1  d

ababa  len:5 next[5]:3

最小循环节长度:2(即ab)    需要补的个数是1  b

下面一道经典例题进行解释

 

 

Power Strings

Time Limit: 3000MS   Memory Limit: 65536K
Total Submissions: 65955   Accepted: 27243

Description

Given two strings a and b we define a*b to be their concatenation. For example, if a = “abc” and b = “def” then a*b = “abcdef”. If we think of concatenation as multiplication, exponentiation by a non-negative integer is defined in the normal way: a^0 = “” (the empty string) and a^(n+1) = a*(a^n).

Input

Each test case is a line of input representing s, a string of printable characters. The length of s will be at least 1 and will not exceed 1 million characters. A line containing a period follows the last test case.

Output

For each s you should print the largest n such that s = a^n for some string a.

Sample Input

abcd
aaaa
ababab
.

Sample Output

1
4
3
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=1e6+5;;
char str[MAXN];
int _next[MAXN];

void getNext(char *p)
{
    int j,k;
    j=0;
    k=-1;
    int len=strlen(p);
    _next[0]=-1;
    while(j<len)
    {
        if(k==-1||p[j]==p[k])
        {
            j++;
            k++;
            _next[j]=k;
        }
        else k=_next[k];
    }
}
int main()
{
    while(scanf("%s",&str),str[0]!='.')
	{
	    getNext(str);
        int len=strlen(str);//str字符串的个数 
        int t=len-_next[len];//最小循环节 
        if(len%t==0)//原串是否能被循环节整除
		printf("%d\n",len/t);
		else printf("1\n");
    }
    return 0;
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/114891.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 数据库MySQL学习——内含34道MySQL练习题及答案

    数据库MySQL学习——内含34道MySQL练习题及答案数据库MySQL1MySQL数据库简介1.1sql、DB、DBMS分别是什么,关系?DB:DataBase数据库DBMS:DateBaseManagementSystem数据库管理系统SQL:结构化查询语言、sql语句的编译有dbms完成DBMS负责执行sql语句,通过之心sql语句来操作DB当中的数据1.2什么是表?table是数据库的基本组成单元,所有的数据都以表格的形式组织,目的是可读性强行:被称为数据/记录(data)列:被称为字段(column)学号(

    2025年12月8日
    3
  • ssh sftp端口_sftp端口号是多少

    ssh sftp端口_sftp端口号是多少ssh/sftp默认端口是22.开通网络策略时,多会因为安全问题产生不便,所以需要修改端口。与其说是修改,不如说是增加,以增加2222端口为例。方法如下:修改ssh配置文件/etc/ssh/ssh_config及/etc/ssh/sshd_config将Port22前面的#放开,并在下面添加Port2222执行命令使配置生效servicesshdrestart检查是否生效sftp-P2222ip…

    2025年11月17日
    3
  • 奔图打印机官网驱动_施乐105P一样的打印机

    奔图打印机官网驱动_施乐105P一样的打印机奔图P3060DW打印机驱动带给大家官方最新驱动程序,这款打印机十分小巧功能却很全面,高速双面黑白激光打印机可以满足大家日常的工作及其它需求,驱动程序非常必要,成功安装后方可使用打印机。奔图P3060DW打印机参数:型号P3060DW打印参数打印速度30ppm(A4)32ppm(Letter)首页打印时间≤8.5秒最大月打印量25000页建议月打印量250页到3000页分辨率(dpi)最大12…

    2022年8月30日
    3
  • java中static关键字的作用_Java:Java中static关键字作用

    java中static关键字的作用_Java:Java中static关键字作用static关键字最基本的用法是:1、被static修饰的变量属于类变量,可以通过类名.变量名直接引用,而不需要new出一个类来2、被static修饰的方法属于类方法,可以通过类名.方法名直接引用,而不需要new出一个类来3、被static修饰的变量、被static修饰的方法统一属于类的静态资源,是类实例之间共享的。@JDK把不同的静态资源放在了不同的类中为什么不把所有静态资源放在一个类里面呢?…

    2022年7月8日
    17
  • ajax跨域问题以及解决方案_js跨域请求的三种方法

    ajax跨域问题以及解决方案_js跨域请求的三种方法出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)AJAX跨域请求下面简单模拟一个场景—–>>前端有.

    2022年8月24日
    7
  • dm368流程_dm code

    dm368流程_dm codehttp://www.ahcit.com/?p=4038

    2022年8月13日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号