Pagini recente » Cod sursa (job #2463565) | Cod sursa (job #2534789) | Cod sursa (job #1150498) | Cod sursa (job #2335579) | Cod sursa (job #38384)
Cod sursa(job #38384)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define NMAX 2010
int N;
char s[NMAX];
short *din[NMAX];
short dup[10][NMAX];
short ina[10][NMAX];
int nsol;
char sol[NMAX];
inline int MAX(int a, int b) { return (a > b) ? a : b; }
int main()
{
int i, j, q, w;
freopen("elimin2.in", "r", stdin);
freopen("elimin2.out", "w", stdout);
scanf("%s", s);
N = strlen(s);
for (i = 1; i <= N; i++) din[i] = (short *) malloc((N - i + 5) * sizeof(short));
for (i = 1; i <= N; i++) {
for (j = 1; j <= N - i + 1; j++) {
q = j; w = j + i - 1;
din[i][j] = 0;
if (s[q - 1] == s[w - 1]) {
if (q == w) din[i][j] = MAX(din[i][j], 1);
else
if (q + 1 == w) din[i][j] = MAX(din[i][j], 2);
else din[i][j] = MAX(din[i][j], din[i - 2][j + 1] + 2);
}
if (i > 1) din[i][j] = MAX(din[i][j], MAX(din[i-1][j], din[i-1][j+1]));
}
}
for (i = 1; i <= N; i++)
for (j = 0; j <= 9; j++)
if (s[i - 1] == j + '0') ina[j][i] = i;
else ina[j][i] = ina[j][i-1];
for (i = N; i >= 1; i--)
for (j = 0; j <= 9; j++)
if (s[i - 1] == j + '0') dup[j][i] = i;
else dup[j][i] = dup[j][i+1];
// reconstituirea solutiei
int L = din[N][1];
// vad daca exista cu L
for (; L; L--) {
for (j = 1; j <= 9; j++) {
q = dup[j][1];
w = ina[j][N];
if (!q || !w || w < q) continue;
if (din[w - q + 1][q] != L) continue;
break;
}
if (j == 10) continue;
break;
}
int beg, end;
beg = 1; end = N;
int jeg = 0;
for (i = 1; i <= L; ) {
// printf("%d %d\n", beg, end);
for (j = 9; j >= 0; j--) {
q = dup[j][beg];
w = ina[j][end];
if (!q || !w || w < q) continue;
if (din[w - q + 1][q] != L - jeg) continue;
break;
}
// printf("%d\n", j);
nsol++;
sol[nsol] = j + '0';
sol[L - nsol + 1] = j + '0';
jeg++;
i++;
if (nsol != L - nsol + 1) jeg++, i++;
beg = q + 1;
end = w - 1;
}
for (i = 1; i <= L; i++) printf("%c", sol[i]);
printf("\n");
fclose(stdin);
fclose(stdout);
return 0;
}