В начале в строке находилось 333 троек по 8 плюс одна 8, всего 1000 восьмерок. 1. При выполнения цикла каждая из троек 8 будет заменена на одну 9. Значит у нас получится строка длиной в 334 символа, где 333 девятки и последний символ - восьмерка 2. Далее 333 девятки заменятся на 111 восьмерок плюс последняя восьмерка - всего получим 112 восьмерок 3. Из 112 восьмерок получится 37 девяток и одна восьмерка 4. И 37 девяток получим 12 восьмерок плюс одна девятка и плюс последняя восьмерка 5. 12 восьмерок дадут 4 девятки плюс последние 9 и 8 6. И наконец получаем строку 8998 ответ: 8998
ЮрьевичКарпова1564
11.01.2020
Наивный алгоритм: используя два вложенных цикла, проверить все подстроки, являются ли они палиндромами. Такой алгоритм будет работать O(|S|^2), что при ограничении |S| <= 10^5 потребует примерно 10^10 / 2 сравнений, что достаточно долго.
Оптимизация: в центре у палиндрома четной длины всегда пара одинаковых символов. Их можно найти, а затем увеличивать длину до тех пор, пока это возможно. Плюс этого наблюдения в том, что если пара попадется не в центре, то максимальная длина подстроки-палиндрома с центром в этой паре, будет ограничена сверху. Однако в худшем случае (все символы одинаковы) всё равно придется произвести немалое число сравнений.
Однако задачу можно решить и за линейное время. Например, существует алгоритм Манакера, основанный на том, что можно использовать информацию, что часть строки является палиндромом. А именно, если в длинную-длинную строку-палиндром входит другая подстрока-палиндром, то можно не начинать проверку заново, а использовать уже имеющуюся информацию.
Пример 1: "длинная" подстрока-палиндром: cbbaabbaabbc в которой известна подстрока-палиндром. Тогда в строке есть симметричная подстрока-палиндром: cbbaabbaabbc Пример 2: "длинная" подстрока палиндром: bbaabbaabbaa Зная, что в ней есть подстрока-палиндром bbaabbaabbaa, можно явные сравнения для подстроки с центром в bbaabbaabbaa начинать уже с bbaabbaabbaa
Если не хочется писать самостоятельно, алгоритм Манакера легко находится.
Ответить на вопрос
Поделитесь своими знаниями, ответьте на вопрос:
Заданы три числа x, y, z. если z< 0 , то p задать как максимальное из x и y. если z> =0, то р задать как минимальное из x, y. написать на c++
#include <iostream>
using namespace std;
float x,y,z,P;
int main(){
cin>>x>>y>>z;
if(z<0) P=x>y?x:y;
else P=x<y?x:y;
return 0;
}