Top.Mail.Ru
Ответы
Аватар пользователя
6лет
Изменено
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+4

Помогите с задачей из acmp

Немногие знают, что первые версии текстового редактора из предыдущей задачи были написаны в России программистом Колей. Для этого он несколько месяцев почти не выходил из подвала, где стояли только диван и компьютер.

Вот одна из проблем, с которыми столкнулся Коля в те времена. Во время работы пользователь набирает какой-то текст, а так же может его редактировать. При этом, даже если итоговый результат полностью помещается на экран, в процессе работы отдельные строки могут иметь слишком большую длину. Мы не будем просить вас повторить Колин подвиг и заново написать редактор. Определите, какой максимальной длины строка получалась в течение набора текста, если вам известно, какие клавиши и в каком порядке нажимал пользователь.

Входные данные
Во входном файле INPUT.TXT записана строка из различных символов - последовательность кнопок на клавиатуре, которые нажимал пользователь. Переводы строк заменены на символ '\'. Первые версии редактора поддерживали три управляющие команды, которые закодированы следующим образом:

'<' - удаление предыдущего символа (если курсор находится в начале строки, и эта строка не первая, то удаляется предшествующий перевод строки);
'^' - перемещение в конец предыдущей строки (игнорируется, если курсор находится на первой строке);
'|' - перемещение в конец следующей строки (игнорируется, если курсор находится на последней строке).
Все остальные символы, содержащиеся в файле, имеют коды от 32 (пробел) и выше и должны пониматься как есть. Число нажатий клавиш не превосходит 105.

Выходные данные
В выходной файл OUTPUT.TXT выведите одно целое число - максимальную длину строки, которая была достигнута в течение работы редактора.

По дате
По рейтингу
Аватар пользователя
Новичок
6лет

#include <fstream>
#include <list>

int main() {
std::fstream file("INPUT.TXT", std::ios_base::in);
std::list<size_t> lines(1);
auto it = lines.begin();
size_t maxLength = 0;
char c;

while (file.get(c))
switch (c) {
case '\\':
it = lines.insert(++it, 0);
break;

case '<':
if (*it > 0)
--(*it);
else if (it != lines.begin())
lines.erase(it--);
break;

case '^':
if (it != lines.begin())
--it;
break;

case '|':
if (it != --lines.end())
++it;
break;

default:
if (++(*it) > maxLength)
maxLength = *it;
}

file.close();
file.open("OUTPUT.TXT", std::ios_base::out);
file << maxLength;
file.close();
return 0;
}

Аватар пользователя
Ученик
5лет

Решенбник Абрамян на 3 языках, а также задач с ACMP, Codeforces на сайте
HSECODES.COM