好久没作过有关KMP 的题了,今天复习打个模板, 别忘了。
#include <bits/stdc++.h>
#define N 1000001
using namespace std;
char T[N], P[N];// T为要匹配的字符串, P为模板字符串
int next[N];
void getnext(char P[], int next[])//得到next数组
{
int k = 0;
int l_P = strlen(P);
next[0] = 0;
for(int i = 1; i < l_P; i++)
{
while(k > 0 && P[i] != P[k])
k = next[k - 1];
if(P[i] == P[k])
k++;
next[i] = k;
}
}
bool kmp(char P[], char T[], int next[])
{
int k = 0;
getnext(P, next);
int l_P = strlen(P);
int l_T = strlen(T);
for(int i = 0; i < l_T; i++)
{
while(k > 0 && T[i] != P[k])
k = next[k - 1];
if(T[i] == P[k])
k++;
if(k == l_P)
return true;//匹配成功
}
return false;//匹配失败
}