Advertisement
ElfikCo

Algorytmy lab2

Mar 21st, 2019
346
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.40 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. int dlugosc(char* lan);
  4. int * init_next(char*);
  5. void init_shift(char*, int*);
  6. int KMP(char*, char*, int*);
  7. int BM(char*, char*);
  8. int * KMP_w(char*, char*, int*, int*);
  9. int * BM_w(char*, char*, int*);
  10.  
  11. int main(){
  12.     char wzor[] = "dw";
  13.     char tekst[] = "adwiescie adwadziescia dwa";
  14.     int next = init_next(wzor);
  15.     int ilosc = 0;
  16.     int * numery = KMP_w(tekst, wzor, next, &ilosc);
  17.     //int i = KMP(tekst,wzor,next);
  18.     printf("%d ",ilosc);
  19.     printf("%d ",numery[0]);
  20.     printf("%d ",numery[1]);
  21.     printf("%d ",numery[2]);
  22.     return 0;
  23. }
  24.  
  25. int dlugosc(char *lan){
  26.     int i = 0;
  27.     while(lan[i] != '\0')
  28.         i++;
  29.     return i;
  30. }
  31.  
  32. int * init_next(char * wzor){
  33.     int M;
  34.     int * next = 0;
  35.     int i,j;
  36.     M = dlugosc(wzor);
  37.     next = realloc(next,M*sizeof(int));
  38.     next[0] = -1;
  39.     for(i = 0, j = -1; i < M - 1; i++, j++, next[i] = j){
  40.         while((j >= 0) && (wzor[i] != wzor[j])){
  41.             j = next[j];
  42.         }
  43.     }
  44.     return next;
  45. }
  46.  
  47. int KMP(char * tekst, char * wzor, int * next){
  48.     int i, j;
  49.     int N = dlugosc(tekst), M = dlugosc(wzor);
  50.     for(i = 0, j = 0; i < N && j < M; i++, j++){
  51.         while((j >= 0) && (tekst[i] != wzor[j])){
  52.             j = next[j];
  53.         }
  54.     }
  55.     if(j == M)
  56.         return i - M;
  57.     else
  58.         return -1;
  59. }
  60.  
  61. int * KMP_w(char * tekst, char * wzor, int * next, int * ilosc){
  62.     int index = 0;
  63.     int * indeksy = 0;
  64.     *(ilosc) = 0;
  65.     while (1) {
  66.         index = KMP(tekst,wzor,next);
  67.         if(index == -1)
  68.             break;
  69.         else{
  70.             indeksy = realloc(indeksy,(++*(ilosc))*sizeof(int));
  71.             tekst[index] = 'x';
  72.             indeksy[(*ilosc) - 1] = index;
  73.         }
  74.  
  75.     }
  76.     return indeksy;
  77. }
  78.  
  79. void init_shift(char * wzor, int * shift){
  80.     int i, j;
  81.     int K = 256;
  82.     int M = dlugosc(wzor);
  83.     for(i = 0; i < K; i++)
  84.         shift[i] = M;
  85.     for(i = 0; i < M; i++)
  86.         shift[wzor[i]] = M - i - 1;
  87.  
  88.     return;
  89. }
  90.  
  91. int BM(char * tekst, char * wzor){
  92.     int shift[256];
  93.     int M = dlugosc(wzor);
  94.     int N = dlugosc(tekst);
  95.     int i,j,x;
  96.     init_shift(wzor,shift);
  97.     for(i = M - 1, j = M - 1; j >= 0; i--, j--)
  98.         while(tekst[i] != wzor[j]){
  99.             x = shift[tekst[i]];
  100.             if(M - j > x)
  101.                 i += M - j;
  102.             else
  103.                 i += x;
  104.             if(i >= N)
  105.                 return -1;
  106.             j = M - 1;
  107.         }
  108.     return i+1;
  109. }
  110.  
  111. int * BM_w(char * tekst, char * wzor, int * ilosc){
  112.     int index = 0;
  113.     int * indeksy = 0;
  114.     *(ilosc) = 0;
  115.     while (1) {
  116.         index = BM(tekst,wzor);
  117.         if(index = -1)
  118.             break;
  119.         else{
  120.             indeksy = realloc(indeksy,(++*(ilosc))*sizeof(int));
  121.             tekst[index] = 0;
  122.         }
  123.  
  124.     }
  125.     return indeksy;
  126. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement