Разбор
Рассмотрим входную строку — результирующую строку Хусейна после выполнения всех операций. Инициализируем два указателя: на начало и на конец строки.
Если , то на концах строки находятся разные символы. А именно или слева и справа, или слева и справа. Это значит, что предыдущая строка могла быть увеличена в результате применения одной из заданных операций. В этом случае сдвигаем оба указателя и на одну позицию навстречу друг другу и снова проверяем, могла ли подстрока быть получена в результате операций Хусейна.
Как только для текущей подстроки будет выполняться , ее уже нельзя получить при помощи данных операций. Выводим ее длину – это и будет исходная строка Хусейна.
Пример
Проведем операции Хусейна в обратном порядке.
Строка изначально была у Хусейна.
Реализация алгоритма
Читаем входную строку. Вычисляем ее длину в переменной .
cin >> s; res = s.size();
Инициализируем два указателя: на начало и на конец строки.
i = 0; j = s.size() - 1;
Если , то на концах строки находятся разные символы. Хусейн мог при помощи своей операции получить строку из строки .
while ((i < j) && (s[i] != s[j])) {
Сдвигаем оба указателя и на одну позицию навстречу друг другу и уменьшаем на текущий размер подстроки .
i++; j--; res -= 2; }
Выводим ответ.
cout << res << endl;