Advertisement
xtreh

Лабораторная работа #2

Oct 18th, 2018
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.97 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. int strlen(const char *str)
  4. {
  5.     int i = 0;
  6.     while (str[i] != '\0') i++;
  7.     return i;
  8. }
  9.  
  10. void main()
  11. {
  12.     int strLen, substrLen, offsetTable[255], i, j, k, offset = 0;
  13.     char subString[32], string[128];
  14.    
  15.     fgets(subString, sizeof(subString), stdin); // читаем подстроку
  16.     substrLen = strlen(subString);
  17.     if (substrLen && subString[substrLen - 1] == '\n') { // удаляем '\n' в конце, если есть
  18.         subString[substrLen - 1] = '\0';
  19.         substrLen--;
  20.     }
  21.     // создаём таблицу смещений для каждого символа
  22.     for (i = 0; i < 255; i++) // если символа нет в подстроке, можно прыгать на всю длину подстроки
  23.         offsetTable[i] = substrLen;
  24.     for (i = 0; i < substrLen - 1; i++) // прыгаем на subStrlen - i - 1
  25.         offsetTable[(unsigned char)subString[i]] = substrLen - i - 1;
  26.  
  27.     while (fgets(string, sizeof(string), stdin) != NULL) { // для фикса последнего теста, читаем входящий текст частями
  28.         strLen = strlen(string);
  29.         if (strLen && subString[strLen - 1] == '\n') {
  30.             string[strLen - 1] = '\0';
  31.             strLen--;
  32.         }
  33.  
  34.         if (substrLen - 1 > strLen)
  35.             return;
  36.  
  37.         i = substrLen - 1;
  38.         j = i, k = i;
  39.  
  40.         while (i && i < strLen) {
  41.             j = substrLen - 1; // совмещаем строки с последнего символа подстроки
  42.             k = i; // текущее вхождение
  43.             printf("%d ", offset + k + 1);
  44.  
  45.             while (j > 0 && string[k] == subString[j]) { // сравнение строк
  46.                 k--; // текущее вхождение
  47.                 j--; // проверка на конец подстроки
  48.                 printf("%d ", offset + k + 1);
  49.             }
  50.             // смещаемся на оффсет в таблице
  51.             i += offsetTable[(unsigned char)string[i]];
  52.         }
  53.         offset += strLen; // увеличиваем оффсет для номера вхождения
  54.     }
  55. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement