Advertisement
Guest User

Untitled

a guest
Nov 26th, 2014
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.50 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. void Suffix(char *str, int* suffix)
  5. {
  6.         int t,i,l;
  7.     l=strlen(str); 
  8.     suffix[l-1]=t=l-1;
  9.     i=l-2;
  10.     while(i>=0){
  11.         while((t<(l-1)) && (str[t] != str[i]))
  12.             t=suffix[t+1];
  13.         if(str[t]==str[i])
  14.             t--;
  15.         suffix[i]=t;
  16.         i--;
  17.     }
  18. }
  19.  
  20. void Delta1(char *str, int *arr)
  21. {
  22.     int a, l, j, i;
  23.     a=0;
  24.     l=strlen(str);
  25.     while(a<128){
  26.         arr[a]=l;
  27.         a++;
  28.     }
  29.     j=0;
  30.     while(j<l){
  31.         arr[str[j]-97]=l-j-1;
  32.         j++;
  33.     }
  34. }
  35. int Delta2(char *str, int *delta2)
  36. {
  37.     int i=0, l=strlen(str), t;
  38.     int temp[l];
  39.         Suffix(str, temp);
  40.     t=temp[0]; 
  41.     while (i<l){
  42.         while (t<i)
  43.             t=temp[t+1];
  44.         delta2[i] =t+l-i;
  45.         i++;
  46.     }
  47.     i=0;
  48.     while (i<(l-1)){
  49.         t=i;
  50.         while (t<l){
  51.             t=delta2[t+1];
  52.             if (temp[i]!=temp[t])
  53.                 delta2[t]=l-(i + 1);
  54.         }
  55.         i++;
  56.     }
  57. }
  58. int Max(int a, int b)
  59. {
  60. return (a>b) ? a : b;
  61. }
  62. void BM(char *str1, char *str2, int *arr, int *delta2)
  63. {
  64.     Delta1(str1, arr);
  65.     Delta2(str1, delta2);
  66.     int s, t, i;
  67.     s=strlen(str1)-1;
  68.     t=strlen(str2);
  69.     while(s<t){
  70.         i=s-1;
  71.         while(str2[s]==str1[i]){
  72.             if (i==0){
  73.                 printf("%d ", s);
  74.                 break;
  75.             }          
  76.             i--;
  77.             s--;
  78.         }      
  79.         int p=str2[s];     
  80.         s+= Max(arr[p], delta2[i]);
  81.         s=t;
  82.     }
  83. }        
  84.  
  85. int main(int argc, char **argv)
  86. {
  87.     int *suffix = malloc(sizeof(int)*strlen(argv[1]));
  88.     int *delta2 = malloc(sizeof(int)*strlen(argv[1]));
  89.     int *arr=malloc(sizeof(int)*128);  
  90.     BM(argv[1], argv[2], arr, delta2); 
  91.     free(suffix);
  92.     free(delta2);  
  93.     free(arr); 
  94.     return 0;
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement