Pagini recente » Cod sursa (job #964770) | Cod sursa (job #2667570) | Cod sursa (job #1869925) | Cod sursa (job #1150111) | Cod sursa (job #637148)
Cod sursa(job #637148)
#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+1;
}
}
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;
}
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);
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];
}
for(int i=1;i<=N;i++)
for(int j=i+1;j<=N;j++)
if(S[i-1] == S2[j-1] && B[i] == B[j] && MAX < 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;
}