KMP算法

luogu P3375

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char s[1000010], t[1000010];
int  nxt[1000010], m, n;

int main()
{
    scanf("%s%s", s+1, t+1);                        //用getchar和getline会神奇挂掉 
    m=strlen(s+1), n=strlen(t+1);
    nxt[0]=nxt[1]=0;
    for(int i=2, j=0; i<=n; i++)                    //推导nxt数组 
    {
        while(j && t[j+1]!=t[i])    j=nxt[j];
        if(t[j+1]==t[i])    ++j;
        nxt[i]=j;   
    }
    for(int i=1, j=0; i<=m; i++)                    //匹配 
    {
        while(j && s[i]!=t[j+1])    j=nxt[j];
        if(s[i]==t[j+1])    j++;
        if(j==n)            printf("%d\n", i-n+1);  //输出匹配位置 
    }
    for(int i=1; i<=n; i++) printf("%d ", nxt[i]);
    return 0;
}
上一篇:Autoware 标定工具 Calibration Tool Kit 联合标定 Robosense-16 和 ZED 相机!


下一篇:树莓派4B装载ROS系统启动摄像头