Advertisement
Sawy3R11

AiSD Lab 2 - dokonczyc

Mar 22nd, 2016
246
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.17 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int dlugosc (char *lan);
  5. int * init_next(char *wzor);
  6. void init_shift(char *w, int*shift);
  7. int KMP(char *tekst, char *wzor, int *next);
  8. int BM (char *tekst, char *wzor);
  9. int main(){
  10.     /* TEST funkci dlugosc
  11.     int dl;
  12.     dl = dlugosc("ala11");
  13.     printf("dL: %i", dl); */
  14.    
  15.     int  *next, i, dlWzorca, kmpTEST, bmTEST;
  16.     //char wzor[256];
  17.     char wzor[]= "ABACABAB";
  18.     dlWzorca = dlugosc( wzor);
  19.     next = init_next(wzor);
  20.  
  21.     for(i=0; i< dlWzorca; i++)
  22.         printf("\n[ %i ] = %i", i, next [i]);
  23.  
  24.     kmpTEST = KMP("BABABAABBABAABBB",  "BABAABBB",  init_next("BABAABBB") );
  25.     if(kmpTEST == -1) printf("\nNie znaleziono!");
  26.     else printf("\nZnaleziono na: %i", kmpTEST);
  27.  
  28.     bmTEST = BM("BABABAABBABAABBB",  "BABAABBB");
  29.     if(bmTEST == -1) printf("\nNie znaleziono!");
  30.     else printf("\nZnaleziono na: %i", bmTEST );
  31.  
  32.     system("pause");
  33.     return 0;
  34. }
  35.  
  36. int dlugosc (char *lan)
  37. {
  38.     int i;
  39.     for(i=0; i<256; i++)
  40.         if(lan[i] =='\0') break;
  41.  
  42.     return i;
  43. }
  44. // to jest do KMP
  45. int *init_next(char *wzor){
  46.     int M = dlugosc(wzor);
  47.     int *next = malloc(M*sizeof(int)); // M to dlugosc wzorca,
  48.     int i ; // indeks tekstu
  49.     int j; // indeks wzoraca
  50.     next[0] = -1;
  51.      
  52.  
  53.     for(i=0, j=-1; i<M-1; i++, j++, next[i]=j)
  54.         while( (j>=0) && (wzor[i] != wzor[j]) )
  55.             j = next[j];
  56.     return next;
  57. }
  58. //  to jest do BM
  59. void init_shift(char *w, int*shift){
  60.  
  61.     int i;
  62.     int K = 256;
  63.     int M = dlugosc(w);
  64.    
  65.     for(i=0; i<K; i++)
  66.         shift[i] = M;
  67.     for(i=0; i<M; i++)
  68.         shift[ w[i] ] = M-i-1;
  69. }
  70.  
  71. int KMP(char *tekst, char *wzor, int *next)
  72. {
  73.     int i, j;
  74.     int N = dlugosc(tekst);
  75.     int M = dlugosc( wzor);
  76.     for(i=0, j=0; i<N &&j<M; i++, j++)
  77.         while (( j>=0) && (tekst[i] != wzor[j]))
  78.             j = next[j];
  79.  
  80.     if(j == M)
  81.         return i-M;
  82.     else
  83.         return -1;
  84. }
  85.  
  86. int BM (char *tekst, char *wzor)
  87. {
  88.     int i, j;
  89.     int M = dlugosc(wzor);
  90.     int N = dlugosc(tekst);
  91.     int shift [256];  
  92.     int x;
  93.     init_shift(wzor, shift);
  94.    
  95.     for(i=M-1, j=M-1; j>=0; i--, j--)
  96.     {
  97.         while(tekst[i] != wzor[j]) {
  98.             x = shift[tekst[i]];
  99.             if(M-j > x)
  100.                 i += M-j;
  101.             else i += x;
  102.  
  103.             if(i >= N)
  104.                 return -1;
  105.  
  106.             j = M-1;
  107.         }
  108.     }
  109.  
  110.     return i+1;
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement