#include <iostream>
using namespace std;
#define MAXSIZE 255
typedef struct
{
char ch[MAXSIZE + 1];
int length;
} SString;
void get_next(SString T, int next[])
{
int i = 1, j = 0;
next[1] = 0;
while (i < T.length)
{
if (j == 0 || T.ch[i] == T.ch[j])
{
i++;
j++;
next[i] = j;
}
else
j = next[j];
}
}
void get_nextval(SString T, int nextval[])
{
int i = 1, j = 0;
nextval[1] = 0;
while (i < T.length)
{
if (j == 0 || T.ch[i] == T.ch[j])
{
i++;
j++;
if (T.ch[i] != T.ch[j])
nextval[i] = j;
else
nextval[i] = nextval[j];
}
else
j = nextval[j];
}
}
void Index_KMP(SString S, SString T)
{
int next[MAXSIZE];
get_next(T, next);
int i, j;
i = 1;
j = 1;
while (i <= S.length && j <= T.length)
{
if (j == 0 || S.ch[i] == T.ch[j])
{
i++;
j++;
}
else
j = next[j];
}
if (j > T.length)
cout << "从第 " << i - T.length << " 位开始匹配" << endl;
else
cout << "匹配失败" << endl;
}
int main()
{
SString S, T;
S.length = 0;
T.length = 0;
int n, i;
cout << "输入主串长度:";
cin >> n;
cout << "输入主串:";
for (i = 1; i <= n; i++)
cin >> S.ch[i];
S.length = n;
cout << "输入模式串长度:";
cin >> n;
cout << "输入模式串:";
for (i = 1; i <= n; i++)
cin >> T.ch[i];
T.length = n;
Index_KMP(S, T);
return 0;
}