在b站上学会的,地址https://www.bilibili.com/video/av16828557?t=301
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void prefix_table(char patten[], int prefix[], int n)
{
prefix[0] = 0;
int len = 0;
int i = 1;
while(i<n)
{
if(patten[i]==patten[len]){
len++;
prefix[i] = len;
i++;
}else{
if(len>0)
{
len = prefix[len-1];
}else
{
prefix[i] = len;
i++;
}
}
}
}
void move_prefix_table(int prefix[], int n)
{
int i;
for( i = n - 1; i>0;i--)
{
prefix[i] = prefix[i-1];
}
prefix[0] = -1;
}
void kmp_search (char text[], char pattern[]){
int n = strlen(pattern);
int m = strlen(text);
int *prefix = malloc(sizeof(int)*n);
prefix_table(pattern, prefix, n);
move_prefix_table(prefix, n);
//text[i] len[text] = m
//patten[j] len[pattern] = n
int i=0, j=0;
while(i < m)
{
if(j==n-1&&text[i]==pattern[j])
{
printf("%d\n",i-j+1);
return 0;
}
if(text[i] == pattern[j])
{
i++;j++;
}else
{
j = prefix[j];
if(j==-1){
i++;
j++;
}
}
}
printf("::>_<::\n");
return 0;
}
int main()
{
char pattern[10005], text[1000005];
int n;
scanf("%d", &n);
getchar();
while(n--)
{
gets(text);
gets(pattern);
int prefix[1500];
int n = strlen(pattern);
kmp_search(text, pattern);
}
return 0;
}