几道KMP模板题

本文记录了KMP算法的学习过程,通过分析几道典型题目来加深理解。包括HDU1711(求最小匹配位置)、HDU2087(计算匹配次数)以及洛谷P3375和POJ3641两道模板题,旨在帮助读者掌握KMP算法的应用。
摘要由CSDN通过智能技术生成

几道KMP的模板题

记录下KMP学习过程
注意:这里的模板s1是文本串s2是匹配串(模式串)

HDU1711 Number Sequence链接
最小匹配位置

#include<iostream>
#include<bits/stdc++.h>
#include<queue>
#include<vector>
using namespace std;
typedef long long ll;
const ll maxn=1e6+5;
const ll MOD=1e9+7;
const ll INF=1e15+5;
int _next[maxn];
int s1[maxn],s2[maxn];
void build_next(int len){
   
    int ptr=0,t=-1;
    _next[0]=-1;
    while(ptr<len){
   
        if(t==-1||s2[ptr]==s2[t]){
   
            ptr++;t++;
            _next[ptr]=(s2[ptr]!=s2[t]?t:_next[t]);//优化版(这样写有-1)
            //_next[ptr]=t;//无优化版
        }
        else t=_next[t];
    }
}
int KMP(int len1,int len2){
   
    build_next(len2);
    int ptr1=0,ptr2=0;
    int cnt=0;
    while(ptr1<len1&&ptr2<len2){
   
        if(ptr2==-1||s1[ptr1]==s2[ptr2]){
   
            ptr1++;ptr2++;
        }
        else ptr2=_next[ptr2];

        if(ptr2==len2)return ptr1-len2+1;

    }
    return -1;
}
int main
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值