AcWing 831. KMP字符串

9 篇文章 0 订阅
6 篇文章 0 订阅

kmp 就是

子串求出next 数组后
当 子串 匹配主串时 某位置不匹配
直接跳转到 子串 next数组位置
节省了 前缀的 匹配时间

           1 2 3 4 5 6 7 8 9 
        主:a a b a a b a a c 
        子:aabaac
            010120
            当主6位置和子6位置不匹配的时候
            这时候不是从子串的 第一位开始
            而是直接判断子串的第三位 和目前的i也就是第6为是否相等
            中间省了子串 前缀 aa的判断以

在这里插入图片描述

题目链接

AC代码:

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<sstream>
#include<algorithm>
using namespace std;
#define ll long long
#define mem(a,b) memset((a),(b),sizeof(a));
#define lowbit(a) ((a)&-(a))
const ll inf=0x3f3f3f3f;
//1061109567,2*未超int,allinf=mem(a,0x3f,sizeof(a));
const int N=1e5+10,M=1e6+10;
int n,m;
int ne[N];
char s[M],p[N];
int main(){
       // #define io
#ifdef io
        freopen("in.txt","r",stdin);
#endif
//子串 主串都是从1  开始输入
        cin.tie(0);
        cin>>n>>p+1>>m>>s+1;
        for(int i=2,j=0;i<=n;i++){
            while(j&&p[i]!=p[j+1]) j=ne[j];
            if(p[i]==p[j+1])j++;
            ne[i]=j;
        }
        /*单纯的找子串前后缀相等 依次累加求每一位置的 最大相等长度
        ababb
        00120
        abcabbabcac
        00012012340
        */
        /*
        匹配的时候当子串 某一位后不满足的时候
        直接推到这个位置  的next位置
        这样就节省了 前缀的一部分 扫描的时间
            1 2 3 4 5 6 7 8 9 
        主:a a b a a b a a c 
        子:aabaac
            010120
            当主6位置和子6位置不匹配的时候
            这时候不是从子串的 第一位开始
            而是直接判断子串的第三位 和目前的i也就是第6为是否相等
            中间省了子串 前缀 aa的判断
       */
        for(int i=1,j=0;i<=m;i++){
            while(j&&s[i]!=p[j+1]) j=ne[j];
            if(s[i]==p[j+1])j++;
            if(j==n){
                cout<<i-n<<" ";
                j=ne[j];
            }
        }
        return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值