[目前未找到题目]扩展KMP模板

procedure build_next;
begin
    lena:=length(a);lenb:=length(b);
    next[0]:=lenb;next[1]:=lenb-1;
    for i:=1 to lenb-1 do if b[i]<>b[i+1] then
    begin
        next[1]:=i;break;
    end;
    k:=1;
    for i:=2 to lenb do
    begin
        p:=k+next[k]-1;L:=next[i-k];
        if i+L<=p then next[i]:=L else
        begin
            j:=p-i+1;
            if j<0 then j:=0;
            while (i+j<lenb)and(a[i+j]=b[j]) do inc(j);
            next[i]:=j;k:=i;
        end;
    end;
end;

procedure build_ex;
begin
    if lena<lenb then minlen:=lena else minlen:=lenb;
    ex[0]:=minlen;
    for i:=1 to minlen do if a[i]<>b[i] then
    begin
        ex[0]:=i;break;
    end;
    k:=0;
    for i:=1 to lena do
    begin
        p:=k+ex[k]-1;L:=next[i-k];
        if i+L<=p then ex[i]:=L else
        begin
            j:=p-i+1;
            if j<0 then j:=0;
            while (i+j<lena)and(j<lenb)and(a[i+j]=b[j]) do inc(j);
            ex[i]:=j;k:=i;
        end;
    end;
end;
时间: 2024-10-24 01:04:49

[目前未找到题目]扩展KMP模板的相关文章

扩展KMP模板

扩展KMP:    给出模板串A和子串B,长度分别为lenA和lenB,要求在线性时间内,对于每个A[i](0 <= i < lenA),求出A[i..lenA-1]与B的最长公共前缀长度,记为ex[i](或者说,ex[i]为满足A[i..i + z - 1]==B[0 .. z - 1]的最大的z值).    扩展KMP可以用来解决很多字符串问题,如求一个字符串的最长回文子串和最长重复子串.[算法]    设next[i]为满足B[i..i + z - 1] == B[0..z - 1]的最

HDU 6153 A Secret(扩展KMP模板题)

A Secret Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 256000/256000 K (Java/Others) Total Submission(s): 2523    Accepted Submission(s): 934 Problem Description Today is the birthday of SF,so VS gives two strings S1,S2 to SF as a present,w

HDU 2594 扩展kmp模板题

题目大意: 给定两个字符串,在第一个字符串中找到一个最大前缀作为第二个字符串的后缀 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <vector> 6 #include <queue> 7 #include <climits> 8 #include <cmath>

扩展kmp 模板

#include<iostream> #include<string> using namespace std; const int MM=100005; int next[MM],extand[MM]; char S[MM],T[MM]; void GetNext(const char *T){ int len=strlen(T),a=0; next[0]=len; while(a<len-1 && T[a]==T[a+1]) a++; next[1]=a;

(模板)扩展kmp算法(luoguP5410)

题目链接:https://www.luogu.org/problem/P5410 题意:有两个字符串a,b,要求输出b与a的每一个后缀的最长公共前缀.输出: 第一行有lenb个数,为b的next数组(特别地,next1为lenb) 第二行有lena个数,即答案. 思路:扩展kmp模板,涉及字典树,后续再补,先放模板. AC code: #include<bits/stdc++.h> #define N 1000010 using namespace std; int q,nxt[N],exte

KMP、扩展KMP、Manacher模板

推导过程推荐看这篇: KMP模板: 1 void init(){ 2 int j = nex[0] = -1, i = 0; 3 int len = strlen(str); 4 while(i < len){ 5 if(j == -1 || str[i] == str[j]){ 6 nex[++i] = ++j; 7 }else j = nex[j]; 8 } 9 } 10 int KMP(){ 11 int i = 0, j = 0, sum = 0; 12 int len = strlen

HDU 6153 A Secret(扩展kmp)

A Secret Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 256000/256000 K (Java/Others)Total Submission(s): 1530    Accepted Submission(s): 570 Problem Description Today is the birthday of SF,so VS gives two strings S1,S2 to SF as a present,wh

Part.5【马拉车&amp;扩展KMP】

Manacher(马拉车)是一种求最长回文串的线性算法,复杂度O(n).网上对其介绍的资料已经挺多了的,请善用搜索引擎. 而扩展KMP说白了就是是求模式串和主串的每一个后缀的最长公共前缀[KMP更像是一个自动机] 题目: POJ 1159: Palindrome 求原字符串最少增加几个字符后可变成回文串,相当于求最长回文子序列的长度. 解法:直接求串S和反转串Sr的最长公共子序列. #include <cstdlib> #include <cstdio> #include <

HDU 3336 扩展kmp

题目大意: 找到字符串中所有和前缀字符串相同的子串的个数 对于这种前缀的问题,通常通过扩展kmp来解决 其实吧这是我第一次做扩展kmp的题目,原来确实看过这个概念,今天突然做到,所以这个扩展kmp的模板是做到这道题直接copy的 这里用扩展kmp很好解决问题,_next[i],表示第i位开始所能匹配到的最大公共前缀长度,比如说这个长度为4,那么说明前缀1,2,3,4都出现了一次,我们只在cnt[4]++ 那么最后从n到1,逆向更新cnt[i] += cnt[i+1]即可,最后得到cnt[i]就表