怎麼說呢,之前看算法的時候,覺得思想自己還是理解了,不過就這幾行代碼還真的太那個厲害了,其實現在最不明白的是init_next()函數
裏面的初始化i = 0; k = -1; _next[0] = -1;爲什麼k 要初始化爲-1? 真的不懂,、……………………
#include<iostream>
#define M 10000
#define N 1000000
using namespace std;
int b[M];
int a[N];
int _next[N];
int n,m;
int kmp(){
int i,j;
i = 0;j = 0;
while(i < n && j < m){
if(j == -1 || a[i] == b[j]){
i++;j++;
}
else
j = _next[j];
}
if(j == m)
return i-m+1;
return -1;
}
void init_next(){//非優化版
int i,k;
i = 0; k = -1; _next[0] = -1;
while(i < m){
if(k == -1 || b[i] == b[k]){
i++;k++; _next[i] = k;
}
else
k = _next[k];
}
}
void init_Next(){//優化版
int i,k;
i = 0; k = -1; _next[0] = -1;
while(i < m){
if(k == -1 || b[i] == b[k]){
i++;k++;
if(b[i] != b[k])
_next[i] = k;
else
_next[i] = _next[k];
}
else
k = _next[k];
}
}
int main()
{
int tCase;
cin >>tCase;
while(tCase--){
cin >>n >>m;
for(int i = 0;i < n;i++){
cin >>a[i];
}
for(int i = 0;i < m;i++){
cin >>b[i];
}
init_Next();
cout <<kmp() <<endl;
}
return 0;
}