Advertisement
Guest User

Untitled

a guest
Nov 26th, 2015
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.22 KB | None | 0 0
  1. //ругается валгринд
  2. //Invalid read of size 4
  3. //==12625== at 0x400A90: BMSubst (bmall.c:81) это строчка  k = k + max(deltaone[(int) t[k]], deltatwo[i]);
  4. //==12625== by 0x400B1E: main (bmall.c:89) это строчка     BMSubst(argv[1], argv[2], 123);
  5. //==12625== Address 0x2 is not stack'd, malloc'd or (recently) free'd
  6.  
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include <stdlib.h>
  10.  
  11. int max(int a, int b)
  12. {
  13.     if (a > b)
  14.         return a;
  15.     else
  16.         return b;
  17. }
  18.  
  19. int* suffix(char *s)
  20. {
  21.     int lens = strlen(s);
  22.     int i, t;
  23.     int *sigma = calloc(lens, sizeof(int));
  24.     sigma[lens - 1] = t = lens - 1;
  25.     for (i = lens - 2; i >= 0; i--){
  26.         while ((t < lens - 1) && (s[t] != s[i]))
  27.             t = sigma[t+1];
  28.         if (s[t] == s[i])
  29.             t--;
  30.         sigma[i] = t;
  31.     }
  32.     return sigma;
  33. }
  34.  
  35. int* delta1(char *s, int size)
  36. {
  37.     int *deltaone = calloc(size, sizeof(int));
  38.     int a;
  39.     int lens = strlen(s);
  40.     for (a = 0; a < size; a++)
  41.         deltaone[a] = lens;
  42.     int j;
  43.     for (j = 0; j < lens; j++)
  44.         deltaone[s[j]] = lens - j - 1;
  45.     return deltaone;
  46. }
  47.  
  48. int* delta2(char *s)
  49. {
  50.     int lens = strlen(s), i, t;
  51.     int *deltatwo = calloc(lens, sizeof(int));
  52.     int *sigma = suffix(s);
  53.     t = sigma[0];
  54.     for (i = 0; i < lens; i++){
  55.         while (t < i)
  56.             t = sigma[t + 1];
  57.         deltatwo = t - i + lens;
  58.     }
  59.     for (i = 0; i < lens - 1; i++){
  60.         t = i;
  61.         while (t < lens - 1){
  62.             t = sigma[t + 1];
  63.             if (s[i] != s[t])
  64.                 deltatwo[t] = lens - i -1;
  65.         }
  66.     }
  67.     free(sigma);
  68.     return deltatwo;
  69. }
  70.  
  71. void BMSubst(char *s, char *t, int size)
  72. {
  73.     int *deltaone = delta1(s, size);
  74.     int *deltatwo = delta2(s);
  75.     int lens = strlen(s), lent = strlen(t);
  76.     int k, i;
  77.     for (k = lens - 1; k < lent;){
  78.         i = lens - 1;
  79.         while (t[k] == s[i]){
  80.             if (i == 0){
  81.                     printf("%d ", k);
  82.                 break;
  83.             }
  84.             i--;
  85.             k--;
  86.         }
  87.         k = k + max(deltaone[(int) t[k]], deltatwo[i]);
  88.     }
  89.     free(deltaone);
  90.     free(deltatwo);
  91. }
  92.  
  93. int main(int argc, char **argv)
  94. {
  95.     BMSubst(argv[1], argv[2], 123);
  96.     return 0;
  97. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement