首页 > 其他分享 >KMP模板

KMP模板

时间:2023-11-21 17:03:00浏览次数:29  
标签:子串 主串 匹配 int nex KMP 模板 size

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e3+10,inf = 0x3f3f3f3f;
int nex[N]; //nex[j]的意思是当子串的第j个字符和主串的第i个字符不匹配时,我们应该从子串的nex[j]字符开始重新匹配 
string a,b;
/*
kmp指针回退 j = nex[j - 1]
根本原因:子串的指针j总是表示我们即将要匹配子串的第j个字符,所以如果子串[j]和主串[i]不匹配
那么我们自然是要从子串的nex[j - 1]字符开始重新匹配
*/
void get_next(string b)
{
    int j = 0; //前缀末尾
    for(int i = 1; i < b.size(); i++)
    {
        //指针回退
        while(j > 0 && b[i] != b[j]) j = nex[j - 1];
        //前缀和后缀的末尾相同则计数 
        if(b[j] == b[i]) j++;
        nex[i] = j; 
    } 
}
int kmp(string a,string b) //获取子串在主串中第一次出现的位置
{
    int j = 0; //子串指针j,主串指针i 
    for(int i = 0; i < a.size(); i++)
    {
        while(j > 0 && a[i] != b[j]) j = nex[j - 1]; //3.指针回退 
        if(a[i] == b[j]) j++; //1.当前子串和主串匹配,那么继续匹配子串的下一个 
        if(j == b.size()) //2.如果匹配完了,那么成功匹配的位置是:主串当前长度i - 子串长度b.size() + 1
        {
            //这里是返回子串在主串中第一次出现的位置,如果要解决其他问题,可以在这里进行修改 
            return i - b.size() + 1; 
        }
    }
    return -1; //没有匹配成功返回-1 
}
int main()
{
    getline(cin,a);
    getline(cin,b);
    get_next(b);
    cout << kmp(a,b);
    return 0;
}

 

标签:子串,主串,匹配,int,nex,KMP,模板,size
From: https://www.cnblogs.com/jyssh/p/17846966.html

相关文章

  • 行为型模式-模板方法模式
    1什么是模板方法模式模板方法模式是一种行为设计模式,它定义了一个算法的骨架,将一些步骤的具体实现延迟到子类中。这样可以在不改变算法结构的情况下,允许子类根据自身的需求来实现特定的步骤。模板方法模式通常由一个抽象基类提供一个模板方法,该方法定义了算法的骨架,并调用一系......
  • 【AD域控】组策略模板的导入与使用
    接到了leader的需求,希望能够设置浏览器的主页,由于我们是运维岗,负责AD域控,脑海中第一时间就跳出了舍近求远的域控设置。当然最后也是没有成功,但总结出了在Windows设备上配置MicrosoftEdge策略设置,血泪总结!【AD域控】组策略模板的导入与使用 1.下载MicrosoftEdgeforBusiness......
  • pp_orange的多项式模板
    /*Codebypp_orange*/#include<bits/stdc++.h>#definem_p(a,b)make_pair(a,b)#definepbpush_back#definelllonglong#defineullunsignedlonglong#definelldlongdouble#defineinf0x7FFFFFFF#defineinff9223372036854775807#definerep(i,l,......
  • wpf 自定义按钮模板
    <ButtonWidth="300"Height="100"Content="自定义按钮"Background="Bisque"FontSize="23"Foreground="Orchid"><Button.Template><ControlTemplateTargetType=&qu......
  • GUI-Guider 生成打印机模板并在 ESP32-S3 上面运行
    原文:https://www.jianshu.com/p/51fc4c1d1e66目录目录ESP32-S3移植GUI-Guider的打印机例程前提准备1.GUIGuider生成工程根据屏幕参数新建工程2.移植代码到lvgl例程里将生成的代码作为组件使用与参考链接中的不同调用生成的代码ESP32-S3移植GUI-Guid......
  • 无涯教程-D语言 - 模板(Templates)
    模板是通用编程的基础,它涉及以独立于任何特定类型的方式编写代码。函数模板将函数定义为模板会将其使用的一种或多种类型保留为未指定状态,以便稍后由编译器推导。在模板参数列表中定义了未指定的类型,该参数介于函数名称和函数参数列表之间。因此,函数模板具有两个参数列表-模板......
  • 学习随笔(设计模式:模板方法模式)
    内容今天学习了模板方法模式,模板是一种面向对象高级语言中常用的编程思想。收获1.模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。2.模板编程能大大提高代码的复用性,可以在寻找所......
  • Vue3 模板引用 ref 的实现原理
    什么是模板引用ref?有时候可以使用 ref attribute为子组件或HTML元素指定引用ID。<template><inputref="input"/></template><script>import{defineComponent,ref}from"vue";exportdefaultdefineComponent({setup(){......
  • Makefile 模板(二)
    Makefile模板模板介绍支持存放中间文件的文件夹检查和创建支持源文件位于不同文件夹内模板OBJOUT:=./out/EXEOUT:=./out/INCLUDE_DIR:=./includeSRC_DIR_TEST=./src/test/SRC_DIR_THREADPOLL=./src/WorkThread/LIB:=-lpthreadSRC:=$(wildcard$(SRC_......
  • cbv源码,模板,请求响应,session
    1cbv源码......