给定主串s和模式串p,编写程序输出p在s中出现的首位置,若p不在s中则输出-1。字符串下标从0开始。
输入格式:
输入为2行,第1行主串s,第2行为模式串p。主串和模式串长度不超过100000。
输出格式:
输出为2行,第1行为若干整数,表示模式串p的失败函数值,每个整数后一个空格;第2行为一个整数,表示p在s中出现的首位置,若p不在s中则输出-1。
输入样例:
qwerabcabhlk
abcab
输出样例:
-1 -1 -1 0 1
4
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int next[100009];
void get_next(char *p, int lenp)
{
//int* next = (int *)malloc(sizeof(int) * (lenp+1)); //lenp+1 注意数组越界访问
int i = 0, j = -1;
next[i] = j;
while(i < lenp)
{
if(j == -1 || p[j] == p[i])
{
i++;
j++;
next[i] = j;
}
else
{
j = next[j];
}
}
}
int kmp(char* s, int lens, char *p, int lenp)
{
if(lens < lenp)
return -1;
int i = 0, j = 0;
while(i < lens && j < lenp)
{
if(j == -1 || s[i] == p[j])
{
i++;
j++;
}
else
{
j = next[j];
}
}
return j == lenp ? i - j : -1;
}
int main()
{
char s[1000000], p[1000000];
int n,i;
scanf("%s",s);
scanf("%s",p);
int lens = strlen(s);
int lenp = strlen(p);
get_next(p, lenp);
for(i = 1; i <= lenp; i++)
printf("%d ",next[i]-1);
printf("\n");
int result = kmp(s, lens, p, lenp);
printf("%d",result);
return 0;
}