Cod sursa(job #637179)

Utilizator maritimCristian Lambru maritim Data 20 noiembrie 2011 12:38:35
Problema PalM Scor 20
Compilator cpp Status done
Runda .com 2011 Marime 1.26 kb
#include<stdio.h>
#include<string.h>

#define MaxN 510
#define MaxS 31

int N,MAX,A[MaxN][MaxN][MaxS],B[MaxN];
char S[MaxN],S2[MaxN];

int max(int a,int b)
{
	return a>b ? a:b;
}

void cmlsc(int N,int M)
{
	int MAX;
	for(int i=1;i<=N;i++)
		for(int j=1;j<=M;j++)
		{
			for(int k=0;k<=26;k++)
				A[i][j][k] = max(A[i-1][j][k],A[i][j-1][k]);
			MAX = 0;
			if(S[i-1] == S2[j-1])
			{
				for(int k=0;k<=S2[j-1]-'a';k++)
					if(A[i-1][j-1][k] > MAX)
						MAX = A[i-1][j-1][k];
			}
			A[i][j][S2[j-1]-'a'] = max(MAX+1,A[i][j][S2[j-1]-'a']);
		}
}

void Ad(int a,int b)
{
	for(int j=1;j<=a;j++)
		for(int k=1;k<=b;k++)
			for(int l=0;l<=26;l++)
				A[j][k][l] = 0;	
}

void b(void)
{
	for(int i=1;i<=N;i++)
	{
		for(int j=0;j<=26;j++)
			if(A[i-1][N-i-1][j] > B[i])
				B[i] = A[i-1][N-i-1][j];
	}	
}

int main()
{
	FILE *f = fopen("palm.in","r");
	FILE *g = fopen("palm.out","w");
	
	fgets(S,sizeof(S),f);
	N = strlen(S);
	for(int i=0;i<N;i++)
		S2[N-i-2] = S[i];
	cmlsc(N,N);
	b();
	for(int i=1;i<=N;i++)
		for(int j=i+1;j<=N;j++)
			if(S[i-1] == S[j-1] && B[i] == B[j] && MAX < 2*B[i]+2)
				MAX = 2*B[i]+2;
			else if(MAX < 2*B[i]+1)
				MAX = 2*B[i] + 1;
	fprintf(g,"%d ",MAX);
	
	fclose(g);
	fclose(f);
	return 0;
}