№ | Пользователь | Рейтинг |
---|---|---|
1 | tourist | 4009 |
2 | jiangly | 3823 |
3 | Benq | 3738 |
4 | Radewoosh | 3633 |
5 | jqdai0815 | 3620 |
6 | orzdevinwang | 3529 |
7 | ecnerwala | 3446 |
8 | Um_nik | 3396 |
9 | ksun48 | 3390 |
10 | gamegame | 3386 |
Страны | Города | Организации | Всё → |
№ | Пользователь | Вклад |
---|---|---|
1 | cry | 167 |
2 | Um_nik | 163 |
3 | maomao90 | 162 |
3 | atcoder_official | 162 |
5 | adamant | 159 |
6 | -is-this-fft- | 158 |
7 | awoo | 157 |
8 | TheScrasse | 154 |
9 | Dominater069 | 153 |
9 | nor | 153 |
Название |
---|
Мне кажется, это даже не задача на строки на самом деле, т.к. там речь о подпоследовательности, а не подстроке. Лично я делаю ставку на какую-нибудь жадность. Типа возьмём лексикографически наибольший символ из тех, что мы встречаем в обеих строках, потом наибольший из тех таких, которые в обеих строках справа от взятого и т.д.
Осталось только грамотно реализовать.
Мне кажется можно даже не искать этот минимум, а идти от "z" до "a" и брать символы, пока это возможно (они есть в обеих строках, точнее в той правой части, до которой мы отсекли) Должно за O(n) зайти.
Ну, можно и так. Это уже тонкости реализации, основная идея та же...
Вам обоим все кажется да кажется, перекреститесь уже :).
Задача совсем тупая. Найдем жадно с помощью стека лексикографически максимальные подпоследовательности для обеих строк (назовем их X' и Y'). Далее найдем наибольшую общую подпоследовательность X' и Y' (т.к. X' и Y' являются невозрастающими, это делается просто двумя указателями).UPD. Я с решением наврал. На тесте "aaab aaa" получится пустая строка.
Примерно так я и рассуждал, но не понятно, как нормально реализовать это желательно за O(n).
Алгоритм здесь простой, найти подпоследовательность для 2-ух исходных строк, затем каждый раз искать лексикографически больший символ отсекая его и все что слева от него, и искать в оставшейся правой части до тех пор пока есть из чего выбирать.
У меня проблема, как это все закодить...
Как я понимаю, для нахождения общей подпоследовательности здесь надо использовать что-то быстрее квадрата, что я не могу сообразить и реализовать...
Вот поэтому я создал этот пост.
P.S — как я понял по голосам серых очень любят на CF.
Берем символ "z", смотрим сколько раз он встречается в первой строке и сколько во второй(на том правом куске строки, который остался), после этого берем минимум из эти чисел и столько раз пишем "z", далее делаем то же самое с "y", потом "x" и так до "a" по алфавиту.
И это неправильно. Прежде чем "делать то же самое с 'y'", нужно удалить из обеих строк все символы от начала до k-ой по счета буквы 'z', где k — минимум среди количества букв 'z' в первой и во второй строках.
Да, вы правы. Я пытался это сказать теми словами в скобочках, но когда начал кодить понял, что всё немного сложнее.
А я не заметил то, что Вы написали в скобочках. Пора идти спать :).
Спокойной ночи ;)
Записываем для каждого символа позиции вхождений в строки. Сортируем. Перебираем символы с z до a. Берём в ответ минимум из числа подходящих вхождений данного символа в первой и второй строках. Находить можно бин. поиском.
UPD: а можно просто pop_front'ом удалять лишнее и будет линейно.
Скорее всего, ваш код не уложится по времени. Писать квадрат при ограничениях в 10^5 не самая хорошая идея.