Advertisement
Val_Kir

Алгоритм Бойера — Мура — Хорспула (вроде бы)

Jul 4th, 2018
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.09 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int pr(char *a,char *b, int d_a, int d_b)
  5. {
  6.     int i=0,j,k=0;
  7.     while(i<=d_a-d_b)
  8.     {
  9.         j=0;
  10.         while(a[i+j]==b[j]&&j<d_b)
  11.         {
  12.             j++;
  13.             k++;
  14.         }
  15.         k++;
  16.         if (j==d_b) printf("%d ",i+1);
  17.         //выводим место нахождения строки в подстроке
  18.         //если все символы оказались равны, то счётчик равен длине подстроки
  19.         i++; //в любом случае сдвигаем начало сравнения
  20.     }
  21.     printf("kol-vo sravneniy: %d \n", k);
  22.     return(k);
  23. }
  24.  
  25.  
  26. int bm(char *y, char *x, int n, int m) //y-строка, x-образец, n-длина y, m-длина x
  27. {
  28.     int a, i=0, j, tab[256], k=0;
  29.     char ch;
  30.     for(a=0;a<256;a++) tab[a]=m; //присваиваем всем элементам максимальное значение
  31.     for(j=0;j<m-1;j++) tab[x[j]]=m-j-1; //элементам массива х номера/числа. последний элемент =max знач, потому что идем до м-1
  32.     while(i<=n-m) //идем, пока в строке не будет места для подстроки
  33.     {
  34.         ch=y[i+m-1]; // y[начало+длина x-1]/ окончание сравнения
  35.         for(j=0;j<m;++j)//запоминаем число сравнений
  36.         {
  37.             k++;
  38.             if(x[j]!=y[i+j]) break;//если элемент образца не равен эл строки, выходим
  39.         }
  40.         if(j==m) printf("%d ",i+1); //если длина подстроки равна длине массива x, выводим начало подстроки
  41.         i+=tab[ch]; //смещение на начало подстроки и кол-во чисел
  42.     }
  43.     printf("kol-vo sravneniy: %d \n", k);
  44.     return(k);
  45. }
  46.  
  47. void main()
  48. {
  49.     char a[50],b[50];
  50.     int i=0, k=0,d_a,d_b,t=0;
  51.     puts("vvedite stroki: ");
  52.     gets(a);
  53.     printf("\n");
  54.     gets(b);
  55.     d_a=strlen(a);
  56.     d_b=strlen(b);
  57.     pr(a,b,d_a,d_b);
  58.     printf("\n========\n \n");
  59.     bm(a,b,d_a,d_b);
  60. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement