Advertisement
Guest User

kmpall

a guest
Feb 20th, 2020
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.14 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5. void prefix(char* s, int n1, int* p) {
  6.         p[0] = 0;
  7.         int t = 0, i = 1;
  8.         while (i < n1) {
  9.                 while ((t > 0) && (s[t] != s[i])) t = p[t - 1];
  10.                 if (s[t] == s[i]) t++;
  11.                 p[i] = t;
  12.                 i++;
  13.         }
  14. }
  15.  
  16. void kmpsubst(char* s, char* t, int n1, int n2) {
  17.         int *p;
  18.         p = (int*)malloc(n1 * sizeof(int));
  19.         prefix(s, n1, p);
  20.         int q = 0, k = 0;
  21.         while (k < n2) {
  22.                 while ((q > 0) && (s[q] != t[k])) {
  23.                         q = p[q - 1];
  24.                 }
  25.                 if (s[q] == t[k]) {
  26.                         q++;
  27.                 }
  28.                 if (q == n1) {
  29.                         int r = k - n1 + 1;
  30.                         printf("%d ", r);
  31.                 }
  32.                 k++;
  33.         }
  34.         free(p);
  35. }
  36.  
  37. int main(int argc, char** argv)
  38. {
  39.         char *s = argv[1], *t = argv[2];
  40.         int n1 = strlen(s), n2 = strlen(t);
  41.         kmpsubst(s, t, n1, n2);
  42.           return 0;
  43. }
  44.  
  45. ____________________________________________________________________________________________________________________________
  46.  
  47. Поиск всех вхождений подстроки в строку (Кнут-Моррис-Пратт)
  48.  
  49. Составьте программу kmpall.c, осуществляющую поиск всех вхождений подстроки S в строку T. В программе должен быть реализован алгоритм Кнута-Морриса-Пратта, изменённый таким образом, чтобы при нахождении очередного вхождения S в T алгоритм не завершался, а продолжал сканировать строку T.
  50. Строки S и T должны передаваться в программу через аргументы командной строки. Программа должна выводить в стандартный поток вывода индексы первых символов всех вхождений S в T.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement