Cod sursa(job #37667)

Utilizator sima_cotizoSima Cotizo sima_cotizo Data 25 martie 2007 11:44:19
Problema Elimin 2 Scor 10
Compilator cpp Status done
Runda preONI 2007, Runda 4, Clasa a 10-a Marime 0.99 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

#define FIN "elimin2.in"
#define FOUT "elimin2.out"
#define MAX 2048
#define b(i) a[n-i-1]

char a[MAX], act[MAX], M[MAX];
short L[MAX][MAX];
long i, n, j;

void get(long x, long y) {
	long i, j;
	long p = 0;
	for (i=x, j=y; i && j; ) {
		if ( a[i]==b(j) ) {
			act[p++] = a[i-1];
			i--, j--;
		}
		else {
			if ( L[i][j-1] > L[i-1][j] ) 
				j--;
			else
				i--;
		}
	}
}

int main() {
	freopen(FIN,"r", stdin);
	fgets(a, 2048, stdin);
	fclose(stdin);

	for (i=strlen(a); a[i]>'9' || a[i]<'0'; --i)
		a[i]=0;
	n = strlen(a);
	for (i=0; i<n; ++i)
		for (j=0; j<n; ++j)
			if ( a[i]==b(j) ) 
				L[i+1][j+1] = L[i][j] + 1;
			else
				L[i+1][j+1] = max(L[i][j+1], L[i+1][j]);
	for (i=n; i>=0; --i)
		for (j=n; j>=0; --j)
			if ( L[i][j] == L[n][n] ) {
				get(i,j);
				if ( strcmp(act,M)>=1 ) 
					strcpy(M,act);
//				printf("%s | %s\n", act, M);
			}

	freopen(FOUT, "w", stdout);
	printf("%s\n", M);
	fclose(stdout);
	return 0;
}