kmp模板



#include<iostream>
#include<cstring>   //用trlen
using namespace std;

const int N = 1e6 + 10;
char s[N], p[N];     //s为匹配串,p为模板串
int ne[N];            //记录p的next数组
int main() {
    scanf("%s%s", s + 1,p + 1);     //从1开始读入

    int len_p = strlen(p + 1),len_s = strlen(s + 1);

    for (int i = 2, j = 0; i <= len_p; i ++ )  //j是前缀倒是第二个字母位置,i是后缀最后一个位置
    {
        while (j && p[i] != p[j + 1]) j = ne[j];  //不想等就回溯
        if (p[i] == p[j + 1]) j ++ ;             //相等就继续
        ne[i] = j;                              //记录
    }
   

   for (int i = 1, j = 0; i <= len_s; i ++ ) //i指向匹配串,j指向模板串
   {
       while (j && s[i] != p[j + 1]) j = ne[j]; 
       if (s[i] == p[j + 1]) j ++ ;
       if (j == len_p)                       //匹配成功
       {
        printf("%d\n",i - len_p + 1);
        j = ne[j];                           //回溯到??
           // 匹配成功后的逻辑
       }
   }
   for(auto i = 1;i <= len_p;++i) cout << ne[i] << ' ';


}

感觉懂了!

posted @   bakul  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示