Я выполнил поиск подстроки в строке, используя вариант алгоритма Бойера-Мура. У меня поиск плохого персонажа с усилением, т.е. я сохраняю все позиции в парсере для каждого символа. Я делаю это для последующего смещения в сравнении. У меня также есть поиск хорошего суффикса с помощью Z-функции, а затем вычисление позиций, в которых повторяющаяся подстрока заканчивается в моей строке. И в итоге я просто нахожу максимальный шаг, сравнивая полученные 2 значения и 1 (для безопасности). Но мой кот где-то не работает, а я не могу понять где, подскажите пожалуйста.
int main()
{
//wor - text
//pat - string which i find
std::string alp = "abcdefghijklmnopqrstuvwxyz";
std::vector PPS(26);
for (int i = 0; i < pat.size(); i++)
{
ll pos = alp.find(pat);
PPS[pos].push_back(i);
}
for (int i = 0; i < 26; i++)
{
PPS.push_back(1e9);
}
std::string rev_pat = pat;
reverse(rev_pat.begin(), rev_pat.end());
std::vector Nj = z_func(rev_pat);
reverse(Nj.begin(), Nj.end());
std::vector Li(pat.size(), 0);
for (int i = 0; i < pat.size(); i++)
{
if (Nj != 0)
{
Li[pat.size() - Nj] = i - Nj + 1;
}
}
ll i = pat.size() - 1, nach = pat.size() - 1, kol = 0, start;
bool f = true;
while (nach < ll(wor.size()))
{
i = nach;
start = i;
for (int j = pat.size() - 1; j >= 0; j--)
{
if (pat[j] != wor)
{
ll pos = alp.find(wor);
ll zn = 1e9, zn2;
for (int t = 0; t < PPS[pos].size(); t++)
{
if (abs(j - PPS[pos][t]) < zn)
{
zn = abs(j - PPS[pos][t]);
}
}
//auto it = std::upper_bound(PPS[pos].begin(), PPS[pos].end(), pat.size() - j - 1);
//zn = *it;
if (zn >= 1e8)
{
zn = j;
}
if (nach == i)
{
zn2 = 0;
}
else
{
zn2 = Li[j];
}
nach += max(zn, zn2, 1LL);
f = false;
break;
}
i--;
}
if (f)
{
cout
Подробнее здесь: https://stackoverflow.com/questions/784 ... -algorithm
Проблема, связанная с алгоритмом Бойера Мура ⇐ C++
Программы на C++. Форум разработчиков
-
Anonymous
1714949832
Anonymous
Я выполнил поиск подстроки в строке, используя вариант алгоритма Бойера-Мура. У меня поиск плохого персонажа с усилением, т.е. я сохраняю все позиции в парсере для каждого символа. Я делаю это для последующего смещения в сравнении. У меня также есть поиск хорошего суффикса с помощью Z-функции, а затем вычисление позиций, в которых повторяющаяся подстрока заканчивается в моей строке. И в итоге я просто нахожу максимальный шаг, сравнивая полученные 2 значения и 1 (для безопасности). Но мой кот где-то не работает, а я не могу понять где, подскажите пожалуйста.
int main()
{
//wor - text
//pat - string which i find
std::string alp = "abcdefghijklmnopqrstuvwxyz";
std::vector PPS(26);
for (int i = 0; i < pat.size(); i++)
{
ll pos = alp.find(pat[i]);
PPS[pos].push_back(i);
}
for (int i = 0; i < 26; i++)
{
PPS[i].push_back(1e9);
}
std::string rev_pat = pat;
reverse(rev_pat.begin(), rev_pat.end());
std::vector Nj = z_func(rev_pat);
reverse(Nj.begin(), Nj.end());
std::vector Li(pat.size(), 0);
for (int i = 0; i < pat.size(); i++)
{
if (Nj[i] != 0)
{
Li[pat.size() - Nj[i]] = i - Nj[i] + 1;
}
}
ll i = pat.size() - 1, nach = pat.size() - 1, kol = 0, start;
bool f = true;
while (nach < ll(wor.size()))
{
i = nach;
start = i;
for (int j = pat.size() - 1; j >= 0; j--)
{
if (pat[j] != wor[i])
{
ll pos = alp.find(wor[i]);
ll zn = 1e9, zn2;
for (int t = 0; t < PPS[pos].size(); t++)
{
if (abs(j - PPS[pos][t]) < zn)
{
zn = abs(j - PPS[pos][t]);
}
}
//auto it = std::upper_bound(PPS[pos].begin(), PPS[pos].end(), pat.size() - j - 1);
//zn = *it;
if (zn >= 1e8)
{
zn = j;
}
if (nach == i)
{
zn2 = 0;
}
else
{
zn2 = Li[j];
}
nach += max(zn, zn2, 1LL);
f = false;
break;
}
i--;
}
if (f)
{
cout
Подробнее здесь: [url]https://stackoverflow.com/questions/78433854/problem-involving-the-boyer-moore-algorithm[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия