Advertisement
Guest User

Untitled

a guest
Jul 3rd, 2014
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.04 KB | None | 0 0
  1. int pattern[] = { 1, 2, 3, 1 };  /* I use int instead of char, simpler */
  2. const int n = sizeof(pattern) / 4;
  3. int D[n];
  4. int f[n];
  5.  
  6. int j = n;
  7. int t = n + 1;
  8.  
  9. for (int k = 1; k <= n; k++){
  10.     D[k-1] = 2 * n - k;
  11. }
  12.  
  13. while (j > 0) {
  14.     f[j-1] = t;
  15.     while (t <= n) {
  16.         if (pattern[j-1] != pattern[t-1]) {
  17.             D[t-1] = min(D[t-1], n - j);
  18.             t = f[t-1];
  19.         }
  20.         else {
  21.             break;
  22.         }
  23.     }
  24.     t = t - 1;
  25.     j = j - 1;
  26. }
  27.  
  28. int f1[n];
  29. int q = t;
  30. t = n + 1 - q;
  31. int q1 = 1;
  32. int j1 = 1;
  33. int t1 = 0;
  34.  
  35.  
  36. while (j1 <= t) {
  37.     f1[j1 - 1] = t1;
  38.     while (t1 >= 1) {
  39.         if (pattern[j1 - 1] != pattern[t1 - 1]) {
  40.             t1 = f1[t1 - 1];
  41.         }
  42.         else {
  43.             break;
  44.         }
  45.     }
  46.     t1 = t1 + 1;
  47.     j1 = j1 + 1;
  48. }
  49. while (q < n) {
  50.     for (int k = q1; k <= q; k++) {
  51.         D[k - 1] = min(D[k - 1], n + q - k);
  52.     }
  53.     q1 = q + 1;
  54.     q = q + t - f1[t - 1];
  55.     t = f1[t - 1];
  56. }
  57.  
  58. for (int i = 0; i < n; i++)
  59. {
  60.     cout << D[i] << " ";
  61. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement