怎么说呢,之前看算法的时候,觉得思想自己还是理解了,不过就这几行代码还真的太那个厉害了,其实现在最不明白的是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;
}