Скорее всего, их инструменты решают только первую часть задачи, а именно получение места вхождения каждой подстроки в строку. Для начала можно попытаться решить эту часть, как советует Армянское Радио или с помощью суффиксного массива.
Дальше задача сводится к поиску наилучшего покрытия отрезка непересекающимися отрезками. У меня не получилось быстро найти решение, но можно поробовать написать динамику.
На уровне идеи:
Допустим у нас есть n отрезков начала и концы которых обознацим b_i и e_i. Длинной покрытия будем называть сумму длин выбранных непересекающихся отрезков. Очевидно ее надо максимизировать. Обозначим как d[e_p] максимальную длину покрытия отрезками, для которых b_i > e_p. Отсортируем отрезки по e_i (по возрастанию). Тогда d[e_n] = 0. Посчитаем d[e_k] , если d[e_k + 1], d[e_k + 2], ...,d[e_n] уже посчитаны. Пусть b_s минимальное из начал отрезков такое, что b_s > e_k. Рассмотрим все отрезки пересекающиеся с началом принадлежащим s. S или один из этих отрезков входит в максимальное покрытие d[e_k]. Назовем их множество, вместе с s буквой L. Тогда d[e_k] = max(e_i - b_i + d[e_i]) по всем i из L.
Я не на 100% уверен, что это будет работать, но можете попробовать доказать.
cheetahfm: Ну в любом случае вы должны получить какой-то результат. Ну то же синтаксическое дерево построить. Или посчитать что-то. Ну а имея дерево получить код на ASM или, каком-нибудь pascal достаточно просто.
Homchenkokostya: Сомнительная гарантия уникальности. Собьется время на одном из серверов, и пойдут перетираться пользователи. Ну и можно получить 2 одновременные регистрации теоретически.
И да, я согласен с Rsa97 для начала стоит понять как писать парсер для конкретной грамматики, и только потом, при необходимости, писать генератор парсеров.
Ну, придумать обратную польскую запись или парсер немного сложнее максимума в массиве. Но вот как можно не загуглить заголовок вопроса перед его публикацией я не понимаю.
pi314: Да, структура данных heap это частный случай бинарного дерева. С ее помощью действительно можно написать управление памятью. Но с таким же успехом для этого можно использовать например linked-list. Реально используемые аллокаторы работают по достаточно сложным алгоритмам (см. Hoard memory allocator). Например выделение памяти для данных различного размера может происходить совершенно по-разному. Под очень большие данные память выделяется целыми страницами средствами ОС. Для маленьких объектов заводится пул из блоков фиксированного размера. Со средними работают еще как-нибудь по другому. Все эти сложности нужны чтобы обеспечить хорошую скорость выделения и очистки памяти, минимизировать фрагментацию и обеспечить безопасность при многопоточности.
pi314: "Куча" как синоним динамической памяти не имеет ничего общего со структурой данных "куча". Стек приложения действительно реализуется на основе одноименной структуры данных.
tsarevfs
@tsarevfs Автор вопроса, куратор тега C++
ManWithBear: Кокос все же полноценный движок, а хотелось найти что-то совсем простое. Да я, наверное, за вечер разберусь как написать и собрать простое приложение. Но объяснить это человеку, который месяц назад начал писать на С++ может быть не так просто.
@bromzh: ООП это и есть совокупность паттернов. Да, их можно реализовать без непосредственной поддержки в языке, хоть на машинных кодах. Иногда так и делают, когда пишут, например, на чистом C.
В случае модуля у нас нет понятия экземпляр. Для моего примера понятно как работать с одним квадратом, если описать его как модуль. Работу с массивом квадратов уже необходимо поддерживать в самом модуле. А мы хотим использовать различные коллекции, то все сильно усложняется.
Обходится без наследования и полиморфизма конечно можно, но очень не хочется.
Дальше задача сводится к поиску наилучшего покрытия отрезка непересекающимися отрезками. У меня не получилось быстро найти решение, но можно поробовать написать динамику.
На уровне идеи:
Допустим у нас есть n отрезков начала и концы которых обознацим b_i и e_i. Длинной покрытия будем называть сумму длин выбранных непересекающихся отрезков. Очевидно ее надо максимизировать. Обозначим как d[e_p] максимальную длину покрытия отрезками, для которых b_i > e_p. Отсортируем отрезки по e_i (по возрастанию). Тогда d[e_n] = 0. Посчитаем d[e_k] , если d[e_k + 1], d[e_k + 2], ...,d[e_n] уже посчитаны. Пусть b_s минимальное из начал отрезков такое, что b_s > e_k. Рассмотрим все отрезки пересекающиеся с началом принадлежащим s. S или один из этих отрезков входит в максимальное покрытие d[e_k]. Назовем их множество, вместе с s буквой L. Тогда d[e_k] = max(e_i - b_i + d[e_i]) по всем i из L.
Я не на 100% уверен, что это будет работать, но можете попробовать доказать.