


Задача на С++ обработка строк
Немногие знают, что первые версии текстового редактора из предыдущей задачи были написаны в России программистом Колей. Для этого он несколько месяцев почти не выходил из подвала, где стояли только диван и компьютер.
Вот одна из проблем, с которыми столкнулся Коля в те времена. Во время работы пользователь набирает какой-то текст, а так же может его редактировать. При этом, даже если итоговый результат полностью помещается на экран, в процессе работы отдельные строки могут иметь слишком большую длину. Мы не будем просить вас повторить Колин подвиг и заново написать редактор. Определите, какой максимальной длины строка получалась в течение набора текста, если вам известно, какие клавиши и в каком порядке нажимал пользователь.
Входные данные:
Во входном файле INPUT.TXT записана строка из различных символов - последовательность кнопок на клавиатуре, которые нажимал пользователь. Переводы строк заменены на символ '\'. Первые версии редактора поддерживали три управляющие команды, которые закодированы следующим образом:
'<' - удаление предыдущего символа (если курсор находится в начале строки, и эта строка не первая, то удаляется предшествующий перевод строки);
'^' - перемещение в конец предыдущей строки (игнорируется, если курсор находится на первой строке);
'|' - перемещение в конец следующей строки (игнорируется, если курсор находится на последней строке).
Все остальные символы, содержащиеся в файле, имеют коды от 32 (пробел) и выше и должны пониматься как есть. Число нажатий клавиш не превосходит 10^5.
Выходные данные:
В выходной файл OUTPUT.TXT выведите одно целое число - максимальную длину строки, которая была достигнута в течение работы редактора.
Тест 1:
Hello, World???<<<!
15
Тест 2:
Hello, World?\This is^<!!!| a sample.
17
#include <iostream>
#include <fstream>
#include <string>
int main() {
std::ifstream input("INPUT.TXT");
if (!input) {
std::cerr << "Error opening filen";
return 1;
}
std::string sequence;
std::getline(input, sequence);
int max_length = 0;
int current_length = 0;
int previous_lines = 0;
for (char c : sequence) {
switch (c) {
case '<':
if (current_length > 0) {
current_length--;
} else if (previous_lines > 0) {
previous_lines--;
current_length = max_length;
}
break;
case '^':
if (previous_lines > 0) {
previous_lines--;
current_length = max_length;
}
break;
case '|':
previous_lines++;
current_length = 0;
break;
default:
current_length++;
break;
}
max_length = std::max(max_length, current_length);
}
std::cout << "Max length: " << max_length << std::endl;
return 0;
}