Максимальный подпалиндром

Компьютеры программирование учёба

Уже 4 часа не могу выловить багу в проге:
Палиндромом называется строка, которая одинаково читается как слева направо, так и справа налево. Подпалиндромом данной строки называется последовательность символов из данной строки, не обязательно идущих подряд, являющаяся палиндромом. Например, HELOLEH является подпалиндромом строки HTEOLFEOLEH. Напишите программу, находящую в данной строке подпалиндром максимальной длины.

Формат входных данных:
Во входном файле находится строка длиной не более 100 символов, состоящая из заглавных букв латинского алфавита.

Формат выходных данных:
Выведите на первой строке выходного файла длину максимального подпалиндрома, а на второй строке сам максимальный подпалиндром. Если таких подпалиндромов несколько, то ваша программа должна вывести любой из них.

Пример
Входные данные:
HTEOLFEOLEH


Выходные данные:
7
HELOLEH
Сама задача тут http://informatics.mccme.ru/moodle/mod/statements/view.php?chapterid=1124
Тут лежит exe файл, кто может потестите плизз, найдёте не рабочие тесты, киньте в ответы.

Код проги, если не лень разбираться:

#include<cstdio>

const int l = 1001;
int a[l][l];
char s1[l], s2[l], p[l];

int max (int i, int j)
{
if (i > j)
return i;
else
return j;
}

int len_str(int n)
{
for (int i = n; i >= 0; i--)
for (int j = n; j >= 0; j--)
{
if ((s1[i] == '\0') || (s2[j] == '\0'))
a[i][j] = 0;
else
{
if (s1[i] == s2[j])
a[i][j] = a[i+1][j+1] + 1;
else
a[i][j] = max (a[i+1][j], a[i][j+1]);
}
}
return a[0][0];
}

void s_pal(int n)
{
int i = 0, j = 0, k = 0;
while (k < n)
{
if (a[i][j+1] == a[i][j])
j++;
else
{
if (a[i+1][j] == a[i][j])
i++;
else
{
p[k] = s1[i];
k++;
i++;
j++;
}
}
}

}

int main()
{
int n, lp;
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
n = 0;
while (!feof(stdin))
{
s1[n] = getchar();
n++;
}
s1[n-1] = '\0';
for (int i = 0; i < n; i++)
s2[n-i-2] = s1[i];
s2[n-1] = s1[n-1];
lp = len_str(n);
for (int i = 0; i < n; i++)
s_pal(lp);
printf("%d\n", lp);
printf("%s", p);
return 0;
}

Примечание:
Простите, не кинул ссылку на exe: http://rghost.ru/35611817

Примечание:
Алгоритм лучше чем с рекурсией, он стабильнее, но не дольше (по крайней мере не на много). А вообще уже разобрался, так что помощь больше не нужна, спасибо)
Ответы:
Я тоже эту задачу решал, правда на C#.
Какой скорости/объёма вычислений достигли? Я вижу алгоритм далеко не оптимален... Сам написал при помощи рекурсии. Глубина стека не больше 100, поэтому можно использовать.


13 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.