数据结构
typedef struct SString
{
char ch[MAXLEN];
int length;
};
KF算法的j的移动函数
void get_next(SString T,int next[])
{
int i=1;next[1]=0;int j=0;
while(i<T.length)
{
if(j==0||T.ch[i-1]==T.ch[j-1])
{
++i;++j;next[i]=j;
}
else
j=next[j];
}
}
经典KMP算法判断,如果串T是串S的子串,输出子串在主串中的第一个位置
int Inder_common_KMP(SString S,SString T,int pos)
{
int next[255];int x;//存放上一个j值
//int t=1;//计数
get_next(T,next);
//12printf("\n");
int i=pos;
int j=1;
while(i<=S.length&&j<=T.length)
{
//x=j;
if(j==0||S.ch[i-1]==T.ch[j-1])
{
++i;++j;
}
else
j=next[j];
} // printf("%d ",j);
//return t;
if(j>T.length)
return i-T.length;
else
return -1;
}
}
//糖块匹配
void Index_interesting( )
{
SString S,T;
int n;//n个同学
scanf("%d",&n);
int a=0;
for(a=0;a<n;a++)
{
scanf("%d",&S.ch[a]);
}
int m;//
scanf("%d",&m);
for(a=0;a<m;a++)
{
scanf("%d",&T.ch[a]);
}
S.length=strlen(S.ch);
T.length=strlen(T.ch);
int next[255];int x;//存放上一个j值
//int t=1;//计数
get_next(T,next);
//12printf("\n");
int i=1;
int j=1;
while(i<=S.length&&j<=T.length)
{
//x=j;
if(j==0||S.ch[i-1]==T.ch[j-1])
{
++i;++j;
}
else
j=next[j];
} // printf("%d ",j);
//return t;
if(j>T.length)
{printf("%d ", i-T.length);
printf("%d\n",i-T.length+m-1);}
else
printf("-1\n");
}
//KMP算法移动次数比较
int Index_KMP(SString S,SString T,int pos)
{
int next[255];int x;//存放上一个j值
int t=1;//计数
get_next(T,next);
printf("\n");
int i=pos;
int j=1;
while(i<=S.length&&j<=T.length)
{
x=j;
if(j==0||S.ch[i-1]==T.ch[j-1])
{
++i;++j;
}
else
j=next[j];
if(j<=T.length)
{
if(x==0);
else
t++;
}
printf("%d ",j);
}
return t;
/*if(j>T.length)
{printf("%d", i-T.length);}
else
printf("-1");*/
}
int Index_BF(SString S,SString T,int pos)
{
int i,j;int t=1;//记录j移动的次数
int c;//存放前一个j值
i=pos;j=1;
while(i<=S.length&&j<=T.length)
{
c=j;
if(S.ch[i-1]==T.ch[j-1]){ ++i;++j;}
else{i=i-j+2;j=1;}
printf("%d ",j);
if(j<=T.length)
t++;
}
return t;
}
int main()
{
SString S,T;
gets(S.ch);
gets(T.ch);
S.length=strlen(S.ch);
T.length=strlen(T.ch);
//printf("KMP比较的次数为%d\n",Index_KMP(S,T,1));
//printf("BF比较的次数为%d\n",Index_BF(S,T,1));
//Index_KMP(S,T,1);
printf("%d",Inder_common_KMP(S,T,1));
Index_interesting();
return 0;
}