首页 > 其他分享 >Z函数(扩展KMP)

Z函数(扩展KMP)

时间:2023-09-14 11:33:05浏览次数:35  
标签:相等 函数 int 扩展 KMP 字符串 string

Z函数(扩展KMP)

用于解决以下问题:给定一个长度为n的字符串\(s\),求出一个数组\(z\),其中\(z_i\)表示字符串\(s(0, n - 1)\)和\(s(i, n - 1)\)的最长公共前缀。其中 \(|s| <= 2 \times 10^7\)。

假设当前已经求出了\(z_0\)到\(z_{i - 1}\),下一个要求\(z_i\):

设\(p\)为\(1\)到\(i - 1\)中,能匹配到的最远距离,即:\(p = max(j + z_j - 1), j \in [1, i - 1]\),记\(p\)取最大值时\(j\)的值为\(k\).

可知:字符串\(s(0, z_k - 1)\)和\(s(k, k + z_k - 1)\)是相等的.

假设此时要求的\(i \in [k, k + z_k - 1]\),可知\(s(i, k + z_k - 1)\)和\(s(i - k, z_k - 1)\)是相等的。

记\(l = z_{i - k}\), 则\(s(0, l - 1)\)和\(s(i - k, i - k + l - 1)\)是相等的. 又因为\(s(i - k, i - k + l - 1)\)和\(s(i, i + l - 1)\)是相等的,因此我们找到了从\(i\)开始的一段长为\(l\)的公共前缀.下面分两种情况:

1.当\(i + l - 1 \leq p\)时,\(z_{i}\)的值即为\(l\).

2.当\(i + l - 1 \geq p\)时,大于\(p\)的部分不一定能和前面匹配上,因此应该从\(p\)开始往后扩展.

算法的复杂度为\(O(n)\),\(n\)为字符串的长度.

代码
const int N = 20000005;
int n, z[N];
string s;
void Z(string &s) {
    n = s.size();
    int p = 0, k = 1; z[0] = n;
    while(z[1] + 1 < n && (s[z[1] + 1] == s[z[1]])) z[1]++;
    p = z[1]; k = 1;
    for(int i = 2; i < n; i++) {
        int l = z[i - k];
        if(i + l - 1 <= p) {
            z[i] = l;
        } else {
            z[i] = max(0, p - i + 1);
            while(z[i] + i < n && (s[z[i] + i] == s[z[i]])) z[i]++;
        }
        if(z[i] > p) {
            p = z[i]; k = i;
        }
    }
}

标签:相等,函数,int,扩展,KMP,字符串,string
From: https://www.cnblogs.com/mcggvc/p/17702099.html

相关文章

  • 无涯教程-JavaScript - ISNONTEXT函数
    描述如果指定的值引用的不是文本,则ISNONTEXT函数将返回逻辑值TRUE。否则返回FALSE。如果该值引用空白单元格,则该函数返回TRUE。语法ISNONTEXT(value)争论Argument描述Required/OptionalvalueValueorexpressionorareferencetoacell.RequiredNotes您可以......
  • 关于 SAP UI5 扩展标准应用的两种方式
    SAPUI5提供了两种方式来让应用开发人员对标准SAPUI5应用进行扩展:SAPUI5Flexibility:这种方式是扩展SAPFioriElements应用程序(基于SAPUI51.56或更高版本)的首选方式。它使用更好的界面,支持分层(layering)以及生命周期hook.ComponentConfiguration:这种方......
  • JS深入学习笔记 - 第一章.构造函数原型与原型链
    1.构造函数和原型 1.1概述在典型的 OOP语言中(如Java),都存在类的概念,类就是对象的模板,对象就是类的实例,但在ES6之前,JS并没有引入类的概念。在ES6之前,对象不是基于类创建的,而是一种称为构建函数的特殊函数来定义对象和它们的特征。有三种创建对象的方式:对象字面量(constob......
  • 农村高中生源转型期提升学生二次函数建模能力的课堂探究
        通过结合具体的数学问题,引导高中生深入分析问题,有效地构建求解问题的数学模型,可以使学生逐步掌握数学问题求解的基本思路以及模型建构的方法与注意事项。但是离开了反复训练,无法从根本上提升高中生的数学建模能力。因此,在平时的高中数学教学中,教师要注意结合数学教学的......
  • mysql函数
     https://www.jb51.net/article/256828.htm#_label19 ......
  • Python学习笔记-Python函数进阶
    函数多返回值思考如果一个函数有两个return,程序如何执行?例如:defreturn_num():return1return2result=return_num()print(result)上面代码只执行了第一个return,因为retrun可以退出当前函数,导致return下方的代码不执行。多个返回值如果一个函数要有多个返回值,书写方式示......
  • Kingbase中手写Mysql底层函数DATE_FORMAT()
    Kingbase中手写Mysql底层函数DATE_FORMAT()分析底层函数的实现逻辑MySQL的DATE_FORMAT()函数其底层逻辑涉及多个组件和模块。以下是DATE_FORMAT()函数的大致实现逻辑:解析日期格式字符串:DATE_FORMAT()函数接受两个参数,一个是日期值,另一个是格式字符串。首先,MySQL解析格......
  • 虚函数和纯虚函数
    虚函数有函数体,纯虚函数没有函数体只是让它等于0虚表中存储着虚函数的地址,纯虚函数在虚表中的值为0纯虚函数定义了一个接口规范,带有纯虚函数的抽象类不能实例化,这就强制抽象类的子类必须实现所有的纯虚函数才能实例化对c++中虚函数和纯虚函数的理解_c++虚函数和纯虚函数的作用_......
  • 匿名函数和常见是内置函数(配合匿名使用)和for循环的原理,异常的捕获
    匿名函数和常见是内置函数(配合匿名使用)和for循环的原理,异常的捕获匿名函数常见的内置函数(配合匿名函数使用)可迭代对象迭代器对象for循环内部原理异常捕获匿名函数匿名函数不需要显示地定义函数名,使用【lambda+参数+表达式】的方式lambda[arg1[,arg2,...argN]......
  • 无涯教程-JavaScript - ISFORMULA函数
    描述如果对包含公式的单元格的引用,则ISFORMULA函数返回逻辑值TRUE。否则返回FALSE。语法ISFORMULA(reference)争论Argument描述Required/OptionalreferenceReferencecanbeacellreference,aformula,oranamethatreferstoacell.RequiredNotes如果引......