跪求大神写一段代码,采用KMP算法,在主串中求模式串的next函数值!主串:abcabcd 模式串bcd!跪求.....
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了跪求大神写一段代码,采用KMP算法,在主串中求模式串的next函数值!主串:abcabcd 模式串bcd!跪求.....相关的知识,希望对你有一定的参考价值。
参考技术A求next程序代码:
void getNext(char*p,int*next)
int j,k;
next[0]=-1; j=0;k=-1;
while(j<strlen(p)-1)
if(k==-1||p[j]==p[k]) //匹配的情况下,p[j]==p[k]
j++;
k++;
next[j]=k;
else //p[j]!=p[k]
k=next[k];
KMP算法主程序:
int KMPMatch(char*s, char*p)
int next[100];
int i,j; i=0; j=0;
getNext( p, next );
while( i < strlen(s) )
if(j==-1||s[i]==p[j])
i++;
j++;
else
j=next[j]; //消除了指针i的回溯
if(j==strlen(p))
return i-strlen(p);
return-1;
本回答被提问者采纳
poj 3461 - Oulipo 经典kmp算法问题
2017-08-13 19:31:47
writer:pprp
对kmp算法有了大概的了解以后,虽然还不够深入,但是已经可以写出来代码,(可以说是背会了)
所以这道题就作为一个模板,为大家使用吧。
题目大意:给你一个子串P和一个主串S,求在主串中有多少个子串?
代码如下:(需要注意的点我都标记好了,两个函数可以直接用)
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> using namespace std; int ans; const int maxn = 1000005; int next[maxn]; char S[maxn],P[maxn]; //构造next数组 void get_next() { int i = 0 ; int j = -1; int lenp = strlen(P); //要用额外变量,如果写在while循环中就会TLE next[0] = -1; while(i < lenp) { if(j == -1 || P[i] == P[j]) { i++; j++; next[i] = j; } else j = next[j]; } } //开始模式匹配 void kmp() { int i = 0 ; int j = 0 ; //要用额外变量,如果写在while循环中就会TLE int lens = strlen(S); int lenp = strlen(P); get_next(); //这个构造不能忘记写 while(i < lens && j < lenp) { if(j == -1 || P[j] == S[i]) { i++; j++; } else j = next[j]; if(j == lenp) { ans++; j = next[j]; } } } int main() { int cas; cin >> cas; while(cas--) { ans = 0; memset(next,0,sizeof(next)); scanf("%s%s",P,S); kmp(); cout << ans << endl; } return 0; }
以上是关于跪求大神写一段代码,采用KMP算法,在主串中求模式串的next函数值!主串:abcabcd 模式串bcd!跪求.....的主要内容,如果未能解决你的问题,请参考以下文章