kmp+kmp改+bf

#include<stdio.h> 
#include<string.h> 
using namespace std; 
const int maxn=100; 
int next[maxn]; 
int next2[maxn];//改进kmp 
char a[maxn]; 
char b[maxn]; 
int la; 
int lb; 
int ant1=0,ant2=0,ant3=0; 
int abc0(int x) 
{ 
 for(int i=x;i<lb+x;i++) 
 { 
  ant1++; 
  if(a[i]!=b[i-x]) 
   return 0; 
 } 
 return 1; 
} 
void abc()//KMP求next 
{ 
 int i=0,j=-1; 
 next[0]=-1; 
 while(i<lb) 
 { 
  if(j==-1||b[j]==b[i]) 
  { 
   i++; 
   j++; 
   next[i]=j; 
  } 
  else 
   j=next[j]; 
 } 
} 
void abc2()//改进KMP求next2 
{ 
 int i=0,j=-1; 
 next2[0]=-1; 
 while(i<lb) 
 { 
  ant2++; 
  if(j==-1||b[j]==b[i]) 
  { 
   i++; 
   j++; 
   if(b[i]!=b[j]) 
   next2[i]=j; 
   else 
   next2[i]=next2[j]; 
  } 
  else 
   j=next2[j]; 
 } 
} 
int main() 
{ 
 int i=0,j=0; 
 scanf("%s%s",a,b); 
 la=strlen(a); 
 lb=strlen(b); 
 for(i=0;i<la-lb+1;i++) 
 { 
  if(abc0(i)) 
  { 
   printf("BF查找到位置:%d\n",i+1); 
   break; 
  } 
 } 
 if(i==la-lb+1) 
  printf("BF未查找到\n"); 
 printf("BF对比次数:%d\n\n",ant1); 
 i=0; 
 j=0; 
 abc();//预处理next 数组; 
 while(i<la&&j<lb) 
 { 
  ant2++; 
  if(j==-1||a[i]==b[j]) 
  { 
   i++; 
   j++; 
  } 
  else 
   j=next[j]; 
 } 
 if(j==lb) 
  printf("kmp查找到位置 %d\n",i-lb+1); 
 else 
  printf("kmp未查找到\n"); 
 printf("kmp对比次数:%d\n\n",ant2); 
 abc2();//预处理next2数组; 
 i=0; 
 j=0; 
 while(i<la&&j<lb) 
 { 
  ant3++; 
  if(j==-1||a[i]==b[j]) 
  { 
   i++; 
   j++; 
  } 
  else 
   j=next2[j]; 
 } 
 if(j==lb) 
  printf("改进kmp查找到位置 %d\n",i-lb+1); 
 else 
  printf("改进kmp未查找到\n"); 
 printf("改进对比次数:%d次\n\n",ant3); 
 return 0; 
} 
/* 
aaabaaaaaac 
aaac 
*/ 
发布了40 篇原创文章 · 获赞 2 · 访问量 867

猜你喜欢

转载自blog.csdn.net/qq_43851311/article/details/103029542
kmp