函数get_nextval(char T[], int nextval[])是计算字符串T的next数组,函数Index_KMP(char S[], char T[], int pos, int next[])是KMP算法。
函数接口定义:
void get_nextval(char T[], int next[]);
int Index_KMP(char S[], char T[], int pos, int next[]);
其中 T
是模式串,S
是主串,next
是next数组。
裁判测试程序样例:
#include<cstring>
#include<iostream>
using namespace std;
#define MAXSTRLEN 255
void get_nextval(char T[], int next[]);
int Index_KMP(char S[], char T[], int pos, int next[]);
int main()
{
char S[MAXSTRLEN+1],T[MAXSTRLEN+1];
char S1[MAXSTRLEN],S2[MAXSTRLEN];
cin >> S1 >> S2;
strcpy(&S[1],S1);
strcpy(&T[1],S2);
S[0]=strlen(S1);
T[0]=strlen(S2);
int *next = new int[T[0]+1];
get_nextval(T,next);
cout<<Index_KMP(S,T,1,next);
return 0;
}
/* 请在这里填写答案 */
输入样例:
第一行输入主串,第二行输入模式串:
abdsegdsagddfddfedfgds
egdsa
输出样例:
输出子串在主串中第p个位置后首次出现的位序:
5
void get_nextval(char p[], int ne[])
{
int m = strlen(p);
for (int i = 2 , j = 0 ; i < m ; i ++ )
{
while(j && p[i] != p[j+1]) j = ne[j];
if(p[i] == p[j+1]) j ++ ;
ne[i] = j;
}
}
int Index_KMP(char s[], char p[], int pos, int ne[])
{
int n = strlen(s);
int m = strlen(p);
int f = 0;
m --;
for (int i = 1 , j = 0 ; i < n ; i ++ )
{
while(j && s[i] != p[j+1]) j = ne[j];
if(s[i] == p[j+1]) j ++ ;
if(j == m)
{
f = i - m + 1;
break;
}
}
return f;
}