//KMP算法(包括改進KMP算法)
#define MAXLEN 25
#include<stdio.h>
#include<string.h>
typedef struct{
char ch[MAXLEN];//ch[0]不用,從ch[1]開始存,位序與下標相等,能存24個數據元素
int length;
}SString;
void get_next(SString T,int next[]){//求next數組
int i=1,j=0;//next[i]=j
next[1]=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[i]=j
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];
}
}
}
int index_KMP(SString S,SString T,int next[]){//KMP
int i=1,j=1;//主串和模式串的指針
while(i<=S.length&&j<=T.length){
if(j==0||S.ch[i]==T.ch[j]){//當第一個字符就不匹配時,ij都右移一位
i++;
j++;
}else{
j=next[j];
}
}
if(j>T.length)return i-T.length;//匹配成功
return 0;//匹配失敗
}
int main(){
char* ss="googlegoogle";
char* tt="abaabcaba";
SString S,T;
//init
for(int i=1;i<13;i++){
S.ch[i]=ss[i-1];
}
S.length=12;
for(int i=1;i<10;i++){
T.ch[i]=tt[i-1];
}
T.length=9;
int next[9];
get_next(T,next);
for(int i=1;i<=9;i++)
printf("%d ",next[i]);
return 0;
}