Advertisement
Guest User

prefixes

a guest
Feb 20th, 2020
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.96 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. void prefix(char* s, int n, int* p) {
  6.         p[0] = 0;
  7.         int t = 0, i = 1;
  8.         while (i < n) {
  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. int main(int argc, char** argv) {
  17.         char *s = argv[1];
  18.         int len = strlen(s);
  19.         int p[len];
  20.         prefix(s, len, p);
  21.         for (int i = 1; i < len; i++) {
  22.           int n = i + 1, k = (n / (n - p[i]));
  23.           if ((n % (n - p[i])) == 0) {
  24.             if (k >= 2) printf("%d %d\n", n, k);
  25.           }
  26.         }
  27.     return 0;
  28. }
  29.  
  30. ___________________________________________________________________________________________________________________________
  31.  
  32. Периодические префиксы
  33.  
  34. Составьте программу prefixes.c, выполняющую поиск всех периодических префиксов заданной строки S. Префикс является периодическим, если его можно представить в виде
  35. dd...d(k раз),
  36. где d – некоторая подстрока. Для поиска префиксов программа должна строить префиксную функцию для строки S.
  37. Программа получает строку S через аргументы командной строки, и для каждого найденного префикса выводит в стандартный поток вывода два числа: длину префикса n и количество повторений k подстроки d в префиксе.
  38. Например, пусть программа вызвана как
  39.  
  40. ./prefixes aabaabaabaab
  41.  
  42. Тогда программа должна выводить в стандартный поток вывода
  43.  
  44. 2 2
  45. 6 2
  46. 9 3
  47. 12 4
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement