Kmp 模板(邝斌 - 人一我百,人百我万)
1,求第一次匹配的位置
void getNext(int m){
int i=0,j=-1;
Next[0]=-1;
while(i < m){
if(j == -1 || p[i] == p[j])
Next[++i] = ++j;
else
j=Next[j];
}
}
bool Kmp(int n,int m){
getNext(m);
int i = 0,j = 0;
while(i < n && j < m){
if(j == -1 || s[i] == p[j]){
i++;
j++;
}
else
j=Next[j];
}
if(j >= m) return true;
else
return false;
}
void getNext(int m){
Next[0]=-1;
int i = 0,j = -1;
while(i < m){
if(j == -1 || p[i] == p[j])
Next[++i]=++j;
else
j = Next[j];
}
}
int Kmp(int n,int m){
getNext(m);
int i = 0,j = 0;
int ans = 0;
while(i < n && j < m){
if(j == -1 || s[i] == p[j]){
i++;
j++;
}
else
j = Next[j];
if(j >= m){
ans++;
j = Next[j];
}
}
return ans;
}3,求 Next 数组的时候
Next[++i]=++j;总是会忘了 ++i,和++j。一定注意别忘了 ++。
浙公网安备 33010602011771号