Cod sursa(job #38384)

Utilizator gcosminGheorghe Cosmin gcosmin Data 25 martie 2007 18:43:14
Problema Elimin 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#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;
}