KMP

KMP模板

网上模板

next数组代表这一位匹配到下一位的位置

void get_nxt
{
nxt[0]=-1;
int i=0,j=-1;
while(i<len)
{
 if(j==1||a[i]==a[j])
 {
  i++,j++;
  nxt[i]=j;
 }
 else j=nxt[i];
}
}
void KMP
{
int i=0,j=0;
while(l<len1&&j<len2)
{
if (j == -1 || t[i] == p[j]) 
        {
                i++;
                j++;

        }
        else j = Next[j];
        if (j == len2)
       {cout<<i-j<<' ';
         j=Next[j];
       }
    }
}
}

yxc模板

nxt[i] 代表能返回的位置

#include <iostream>

using namespace std;

const int N = 100010, M = 1000010;

int n, m;
int ne[N];
char s[M], p[N];

int main()
{
    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;
    }

    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)
        {
            printf("%d ", i - n);
            j = ne[j];
        }
    }

    return 0;
}
posted @ 2021-11-02 12:41  m_rd  阅读(26)  评论(0)    收藏  举报