首页 > 其他分享 >kmp

kmp

时间:2023-04-24 13:59:00浏览次数:23  
标签:int s2 s1 kmp include strlen

#include<iostream>
#include<string.h>
#include<vector>
using namespace std;

const int N=1e6+10;

char s1[N],s2[N];
int d[N];//d[i]表示以i结尾的字符串中 最大公共前后缀的长度 
vector<int> v;

void init()//得到模式串的d[] 下标是从0开始的 
{
    int len=strlen(s2);
    int i=1,j=0;//两个s2串 
    while(i<len)
    {
        if(s2[i]==s2[j])
        d[i++]=++j;
        else {
            if(j>0) j=d[j-1];
            else i++;
        }
    }
}

void kmp()
{
    int i=0,j=0;
    int len=strlen(s1),ns2=strlen(s2);
    while(i<len)
    {
        if(s1[i]==s2[j])
        {
            i++,j++;
            if(j==ns2)//成功找到 
            {
                j=d[j-1];//继续找完所有匹配的子串 
                v.push_back(i-ns2);//s1与s2完全匹配的字串的最左边 
            }
        }
        else {
            if(j>0) j=d[j-1];
            else i++;
        }
    }
}

int main()
{
    scanf("%s%s",s1,s2);
    
    init();
    
    kmp();
    
    for(int x:v) printf("%d\n",x+1);
    int ns2=strlen(s2);
    for(int i=0;i<ns2;i++)
    printf("%d ",d[i]);
    
    return 0;
}

 

标签:int,s2,s1,kmp,include,strlen
From: https://www.cnblogs.com/bwdog/p/17349210.html

相关文章

  • codeforces 126B B. Password(kmp+dp)
    题目链接:codeforces126B题目大意:给出一个字符串,找出一个子串既是它的前缀,也是它的后缀,还是一个非后缀也非前缀的子串。题目分析:本来挺简单的一个题,最开始想复杂了,还用了后缀数组,醉了。这个题主要用的是kmp的next数组,首先我们要了解next数组的定义,next[i]表示以i为末尾的子串的后缀......
  • kmp + exkmp
    kmp:主要就是用于暴力回退的优化一般的暴力回退总是回退到前一个,要枚举很多次如果找到规律那么就会发现可以找到上一次最大匹配的位置然后将继续匹配知道匹配不下去然后去更新代码kmp是前缀到某一个为停止#include<bits/stdc++.h>usingnamespacestd;intn,m;intnx......
  • 26、字符串匹配 KMP 算法
    1、KMP算法的基本原理2、KMP算法的正确性证明3、什么是LPS数组4、LSP数组的计算5、实现LPS数组6、KMP算法的实现7、复杂度分析......
  • KMP算法
    KMP算法要解决的问题就是在字符串(也叫主串)中的模式(pattern)定位问题。说简单点就是我们平时常说的关键字搜索。模式串就是关键字(接下来称它为P),如果它在一个主串(接下来称为T)中出现,就返回它的具体位置,否则返回-1(常用手段)。这里面的前缀集表示除去最后一个字符后的前面的所有子串集合,同......
  • 字符串匹配算法KMP
    KMP算法是字符串的匹配算法,比如我给一个名为《文本》的字符串,和一个名为《样板》的字符串,询问《样板》在《文本》中出现过的次数,这就需要字符串匹配算法。对于匹配,形象一点可以看例子:《文本1》="abcdefghigklmn"《样板1》="abc"=============================《文本2》="abcde......
  • (KMP 1.1)hdu 1711 Number Sequence(KMP的简单应用——求pattern在text中第一次出现的
    题目:NumberSequenceTimeLimit:10000/5000MS(Java/Others)    MemoryLimit:32768/32768K(Java/Others)TotalSubmission(s):12902    AcceptedSubmission(s):5845ProblemDescriptionGiventwosequencesofnumbers:a[1],a[2],......,a[N],andb[1......
  • KMP算法(串的模式匹配算法)(未完待续......)
    KMP算法的实现1.基本原理  在暴力破解算法(BF算法)中,模式串需要一个一个来跟主串进行对比,若有一个不相同,则主串前进一位,继续从头开始进行比较,这样比较的最坏时间复杂度为O(mn),例:‘aaaaaaaaab’和‘aaab’,需要比较到最后一个才能成功,效率太过低下。  KMP算法的原理是,找到模式串......
  • KMP 字符串
    KMP题目描述给定一个字符串\(S\),以及一个模式串\(P\),所有字符串中只包含大小写英文字母以及阿拉伯数字。模式串\(P\)在字符串\(S\)中多次作为子串出现。求出模式串\(P\)在字符串\(S\)中所有出现的位置的起始下标。输入第一行输入整数\(N\),表示字符串\(P\)的长度......
  • KMP
    2021年就学了KMP,2023写一篇详细点的总结。首先我们需要理解朴素做法。枚举开始匹配的位置\(i\),和匹配串中的每个位置逐一匹配,失败就停止移动继续匹配,最坏情况复杂度高达\(O(mn)\)上述做法的缺陷就在于没有充分利用信息,比如匹配失败时就从头开始。我们考虑一次匹配中,如果失......
  • KMP算法
    一、问题引入BF算法的平均时间复杂度过高,提出了一种新的匹配算法KMP算法。主串S的位置i一直往下移动,不再回溯。但字串T的位置j需要根据算法确定下来。二、解决过程函数:get_next()voidget_next(constchar*T,int**next){ inti=0,j=-1; intT_len=strlen(T......