#include <stdio.h>
#define MAXSIZE 255
typedef unsigned char SString[MAXSIZE + 1];
typedef int IneArr[10];//定义整形数组IntArr IntArr a;
//求字符串的长度
int StrLength(SString S){
int i = 1;
while(S[i] != '\0'){
i++;
}
return i - 1;
}
void GetNext(SString T,int next[]){
int j = 1,k = 0;
next[j] = k;
while(j < T[0]){
if(k == 0||T[j] == T[k]){
j++;
k++;
next[j] = k;
}else{
k = next[k];
}
}
}
void GetNextVal(SString T,int nextval[]){
int j = 1,k = 0;
nextval[j] = k;
while(j < T[0]){
if(k == 0||T[j] == T[k]){
j++;
k++;
if(T[j] != T[k]){
nextval[j] = k;
}else{
nextval[j] = nextval[k];
}
}else{
k = nextval[k];
}
}
}
int BMP(SString S1,SString S2,int pos){
int i = pos,j = 1;
int nextval[S2[0]];
GetNextVal(S2,nextval);
while(i < S1[0]&&j < S2[0]){
if(S1[i] == S2[j]||j == 0){
i++;
j++;
}else{
j = nextval[j];
}
}
if(j >= S2[0]){
return i - S2[0] + 1;
}
return 0;
}
void getAllArr(int x){
SString T;
printf("请输入字符串T%d\t",x);
scanf("%s",&T[1]);//S+1
T[0] = StrLength(T);
printf("T%d的长度为 %d\n",x,T[0]);
int next[T[0]+1];
int nextval[T[0]+1];
GetNext(T,next);
printf("T%dnext :",x);
for(int i = 1;i <= T[0];i++){
printf("%d ",next[i]);
}
printf("\n");
GetNextVal(T,nextval);
printf("T%dnextval:",x);
for(int i = 1;i <= T[0];i++){
printf("%d ",nextval[i]);
}
printf("\n");
}
int main(){
int x=1;
SString S,T;//定义字符数组类型S
printf("一、S:ADBADABBAABADABBADADA\tT:ADABBADADA\n");
printf("请输入字符串S\t");
scanf("%s",&S[1]);//S+1
S[0] = StrLength(S);
printf("S的长度为 %d\n",S[0]);
printf("请输入字符串T\t");
scanf("%s",&T[1]);//S+1
T[0] = StrLength(T);
printf("T的长度为 %d\n",T[0]);
printf("T在S的位置是\t%d\n",BMP(S,T,1));
printf("二、T1 = abcaabbabcabaacbacba \t T2 = abcabaa \t T3= aaab\n");
for(;x <= 3;x++){
getAllArr(x);
}
return 0;
}