Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- int strlen(const char *str)
- {
- int i = 0;
- while (str[i] != '\0') i++;
- return i;
- }
- void main()
- {
- int strLen, substrLen, offsetTable[255], i, j, k, offset = 0;
- char subString[32], string[128];
- fgets(subString, sizeof(subString), stdin); // читаем подстроку
- substrLen = strlen(subString);
- if (substrLen && subString[substrLen - 1] == '\n') { // удаляем '\n' в конце, если есть
- subString[substrLen - 1] = '\0';
- substrLen--;
- }
- // создаём таблицу смещений для каждого символа
- for (i = 0; i < 255; i++) // если символа нет в подстроке, можно прыгать на всю длину подстроки
- offsetTable[i] = substrLen;
- for (i = 0; i < substrLen - 1; i++) // прыгаем на subStrlen - i - 1
- offsetTable[(unsigned char)subString[i]] = substrLen - i - 1;
- while (fgets(string, sizeof(string), stdin) != NULL) { // для фикса последнего теста, читаем входящий текст частями
- strLen = strlen(string);
- if (strLen && subString[strLen - 1] == '\n') {
- string[strLen - 1] = '\0';
- strLen--;
- }
- if (substrLen - 1 > strLen)
- return;
- i = substrLen - 1;
- j = i, k = i;
- while (i && i < strLen) {
- j = substrLen - 1; // совмещаем строки с последнего символа подстроки
- k = i; // текущее вхождение
- printf("%d ", offset + k + 1);
- while (j > 0 && string[k] == subString[j]) { // сравнение строк
- k--; // текущее вхождение
- j--; // проверка на конец подстроки
- printf("%d ", offset + k + 1);
- }
- // смещаемся на оффсет в таблице
- i += offsetTable[(unsigned char)string[i]];
- }
- offset += strLen; // увеличиваем оффсет для номера вхождения
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement