Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
2 / 2 / 0
Регистрация: 22.11.2018
Сообщений: 305

Поиск образца в тексте/ Найти все вхождения строки Pattern в строку Tex

23.02.2021, 11:04. Показов 2463. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите пожалуйста

Поиск образца в тексте
Найти все вхождения строки Pattern в строку Text.
Вход. Строки Pattern и Text.
Выход. Все индексы i строки Text, начиная с которых строка Pattern входит в Text:
Text[i..i + |Pattern| − 1] = Pattern.

Реализуйте алгоритм Карпа–Рабина.

Формат входа. Образец Pattern и текст Text.
Формат выхода. Индексы вхождений строки
Pattern в строку Text в возрастающем порядке, используя индексацию с нуля.
Ограничения. 1 ≤ |Pattern| ≤ |Text| ≤ 5 · 105
.
Суммарная длина всех вхождений образца в текста не превосходит 108
. Обе строки содержат буквы латинского алфавита.
Пример.
Вход:
aba
abacaba
Выход:
0 4
Образец aba входит в позициях 0 (abacaba) и 4 (abacaba) в
текст abacaba.
Пример.
Вход:
Test
testTesttesT
Выход:
4
3

Пример.
Вход:
aaaaa
baaaaaaa
Выход:
1 2 3
Данный пример демонстрирует, что вхождения могут накладываться друг на друга.
Подсказки по реализации.
• Будьте осторожны с переполнением целого типа. Применяйте операцию взятия по модулю p после каждой арифметической операции.
• Будьте осторожны с взятием отрицательных чисел по модулю.
• Будьте осторожны с операцией взяти подстроки — она может оказаться дорогой по времени и по памяти.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.02.2021, 11:04
Ответы с готовыми решениями:

Найти в тексте все вхождения данного образца
Буду рад любой помощи вообще непонятна сама организация поиска, помогите пожалуйста

Найти в тексте все вхождения данного образца
Здравствуйте! Очень нужна помощь. Задание: найти в тексте все вхождения данного образца. То есть это просто поиск подстроки в строке?...

Найти в тексте все вхождения строки по шаблону
Добрый день Задача такая - найти в тексте все вхождения строки и сложить эти вхождения в массив Условия: 1. строка должна начинаться...

2
2 / 2 / 0
Регистрация: 22.11.2018
Сообщений: 305
20.03.2021, 13:15  [ТС]
Помогите пожалуйста

Поиск образца в тексте
Найти все вхождения строки Pattern в строку Text.
Вход. Строки Pattern и Text.
Выход. Все индексы i строки Text, начиная с которых строка Pattern входит в Text:
Text[i..i + |Pattern| − 1] = Pattern.

Реализуйте алгоритм Карпа–Рабина.

Формат входа. Образец Pattern и текст Text.
Формат выхода. Индексы вхождений строки
Pattern в строку Text в возрастающем порядке, используя индексацию с нуля.
Ограничения. 1 ≤ |Pattern| ≤ |Text| ≤ 5 · 105
.
Суммарная длина всех вхождений образца в текста не превосходит 108
. Обе строки содержат буквы латинского алфавита.
Пример.
Вход:
aba
abacaba
Выход:
0 4
Образец aba входит в позициях 0 (abacaba) и 4 (abacaba) в
текст abacaba.
Пример.
Вход:
Test
testTesttesT
Выход:
4
3

Пример.
Вход:
aaaaa
baaaaaaa
Выход:
1 2 3
Данный пример демонстрирует, что вхождения могут накладываться друг на друга.
Подсказки по реализации.
• Будьте осторожны с переполнением целого типа. Применяйте операцию взятия по модулю p после каждой арифметической операции.
• Будьте осторожны с взятием отрицательных чисел по модулю.
• Будьте осторожны с операцией взяти подстроки — она может оказаться дорогой по времени и по памяти.
0
2 / 2 / 0
Регистрация: 22.11.2018
Сообщений: 305
20.03.2021, 13:17  [ТС]
вот код но не проходит
вот ссылка степика где должно пройти тест https://stepik.org/lesson/41562/step/3?unit=20016
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include <iostream>
#include <vector>
 
#define q 1000000007l
#define x 31            /* <--- overflow with large numbers, all tests passed with x = 1 only; pow() is slow */
 
class RabinKarp
{
public:
    RabinKarp(std::string const & pattern, std::string const & text): _pattern(pattern) {
 
        _length = pattern.length();
        _patternHash = hash(pattern);
        check(text);
        _occ.shrink_to_fit();
    }
 
    ~RabinKarp() {}
 
    void    showOccurences() {
 
        for (unsigned i : _occ)
            std::cout << i << " ";
        std::cout << std::endl;
    }
 
    std::vector<unsigned> const & getOccurences() { return _occ; }
private:
    std::vector<unsigned>   _occ;
    size_t                  _length;
    long long               _patternHash;
    std::string             _pattern;
 
    void        check(std::string const & str) {
 
        size_t      i = 1;
        long long   newHash;
        long long   oldHash;
        long long   tmp;
        char        newChar;
        char        oldChar;
        size_t      len = str.length() - _length + 1;
 
        oldChar = str[0];
        oldHash = hash(str);
        if (oldHash == _patternHash && equal(str, 0))
            _occ.push_back(0);
        while (i < len) {
            newChar = str[i + _length -1]; 
            tmp = ((oldHash - oldChar)%q +q)%q;
            tmp /= x;
            newHash = tmp +  ((newChar * pow(x, _length - 1))%q)  % q;
            newHash %= q;
            if ( newHash == _patternHash && equal(str, i))
                _occ.push_back(i);
            oldHash = newHash;
            oldChar = str[i];
            ++i;
        }
    }
 
    bool        equal(std::string const & str, size_t index) {
 
        size_t i = 0;
        while (i < _length) {
            if (_pattern[i] != str[index])
                return false;
            ++index;
            ++i;
        }
        return true;
    }
 
    long long   pow(long long base, size_t power) {
 
        long long res = 1;
        if (power == 0 || base == 1)
            return 1;
        for (size_t i = 0; i < power; ++i) {
            res = (res * base)%q;
        }
        return res % q;
    }
 
    long long   hash(std::string const & str) {
 
        size_t i = 0;
        long long res = 0;
        long long tmp;
 
        while (i < _length) {
            tmp = str[i]  * pow(x, i);
            res = (res + tmp) % q;
            ++i;
        }
        return res % q;
    }
};
 
int     main(void)
{
    std::string     pattern;
    std::string     text;
 
    std::cin >> pattern >> text;
 
    RabinKarp(pattern, text).showOccurences();
 
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.03.2021, 13:17
Помогаю со студенческими работами здесь

Ввести с экрана строку и подстроку. Найти все вхождения подстроки в строку и удалить их из исходной строки
Ввести с экрана строку и подстроку. Найти все вхождения подстроки в строку и удалить их из исходной строки.

Найти все вхождения строки T в строку S
Найти все вхождения строки T в строку S. Формат входных данных В первой строке входного файла записана строка S, во второй строке...

Найти все вхождения подстроки в строку и удалить их из исходной строки
Ввести с экрана строку и подстроку. Найти все вхождения подстроки в строку и удалить их из исходной строки.

Найти все индексы вхождения элементов второй строки в первую строку
Всем здравствуйте форумчане! Мне требуется найти все индексы вхождения элементов 2 строки в 1 строку. :help: Я сделал так и выводит...

Поиск образца в тексте
Дан текст, состоящий из строчных латинских букв, и шаблон, состоящий из строчных латинских букв и знаков вопроса. Знак вопроса может...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru