Guest User

Untitled

a guest
Apr 9th, 2015
282
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.05 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int *
  6. kmp_prefix(const char *needle, int nsize)
  7. {
  8.     int i = 1;
  9.     int k = -1;
  10.     int *pi = malloc(sizeof(int) * nsize);
  11.  
  12.     pi[0] = k;
  13.     for (i = 1; i < nsize; i++) {
  14.         while (k > -1 && needle[k + 1] != needle[i])
  15.             k = pi[k];
  16.         if (needle[i] == needle[k + 1])
  17.             k++;
  18.         pi[i] = k;
  19.     }
  20.     return pi;
  21. }
  22.  
  23. char *
  24. kmp_strstr(const char *haystack, const char *needle)
  25. {
  26.     int i, k = -1;
  27.     int nsize = strlen(needle);
  28.     int hsize = strlen(haystack);
  29.     int *pi = kmp_prefix(needle, nsize);
  30.  
  31.     for (i = 0; i < hsize; i++) {
  32.         while (k > -1 && needle[k + 1] != haystack[i])
  33.             k = pi[k];
  34.         if (haystack[i] == needle[k + 1])
  35.             k++;
  36.         if (k == nsize - 1) {
  37.             free(pi);
  38.             return (char*) haystack + i - k;
  39.         }
  40.     }
  41.     free(pi);
  42.     return NULL;
  43. }
  44.  
  45. char *
  46. naive_strstr(const char *haystack, const char *needle)
  47. {
  48.     int i, j;
  49.     int nsize = strlen(needle);
  50.     int hsize = strlen(haystack);
  51.     for (i = 0; i < hsize - nsize + 1; i++) {
  52.         for (j = 0; j < nsize; j++)
  53.             if (haystack[i + j] != needle[j])
  54.                 break;
  55.         if (j == nsize)
  56.             return (char*) haystack + i;
  57.     }
  58.     return NULL;
  59. }
  60.  
  61. int
  62. main(int argc, char *argv[])
  63. {
  64.     const int nsize = 32 * 1024;
  65.     const int hsize = 32 * 1024 * 1024;
  66.  
  67.     int i;
  68.     char *needle = malloc(nsize);
  69.     char *haystack = malloc(hsize);
  70.  
  71.     for (i = 0; i < nsize - 1; i++)
  72.         needle[i] = 'a';
  73.     for (i = 0; i < hsize - 1; i++)
  74.         haystack[i] = 'a';
  75.  
  76.     needle[nsize - 1] = 0;
  77.     needle[nsize / 2] = 'b';
  78.     haystack[hsize - 1] = 0;
  79.  
  80.     if (argc < 2)
  81.         return 1;
  82.     else if (!strcmp(argv[1], "kmp"))
  83.         return !!kmp_strstr(haystack, needle);
  84.     else if (!strcmp(argv[1], "naive"))
  85.         return !!naive_strstr(haystack, needle);
  86.     // else if (!strcmp(argv[1], "tsar"))
  87.     //    return !!tsar_strstr(haystack, needle);
  88. }
Advertisement
Add Comment
Please, Sign In to add comment