Pagini recente » Profil Samoila_Alexandru | Cod sursa (job #505863) | Cod sursa (job #1438567) | Cod sursa (job #151388) | Cod sursa (job #2035896)
#include <bits/stdc++.h>
#define MaxN 2005
#define INF 2140000000
#define MOD 1000000007
using namespace std;
FILE*IN,*OUT;
short N,S;
struct dynamic
{
short L;
char Digit;
pair<short,short>to;
}d[MaxN][MaxN];
char str[MaxN],out[MaxN],Stack[MaxN];
bool comp(dynamic a,dynamic b)
{
return a.L<b.L||(a.L==b.L&&a.Digit<b.Digit);
}
void Solve(short i,short j)
{
short x,y;
while(i!=-1&&j!=-1)
{
if(d[i][j].L>1)
Stack[++S]=d[i][j].Digit;
fprintf(OUT,"%c",d[i][j].Digit);
x=d[i][j].to.first;
y=d[i][j].to.second;
i=x,j=y;
}
for(int i=S;i>0;i--)
fprintf(OUT,"%c",Stack[i]);
}
int main()
{
IN=fopen("elimin2.in","r");
OUT=fopen("elimin2.out","w");
fscanf(IN,"%s",str);
N=strlen(str);
for(int i=0;i<N;i++)
{
d[i][i].L=1;
d[i][i].Digit=str[i];
d[i][i].to={-1,-1};
}
for(int D=1;D<N;D++)
for(int i=0;i<N-D;i++)
{
d[i][i+D]=d[i][i+D-1];
if(comp(d[i][i+D],d[i+1][i+D]))
d[i][i+D]=d[i+1][i+D];
if(str[i]==str[i+D])
{
dynamic t=d[i+1][i+D-1];
t.L+=2;
t.Digit=str[i];
if(i+1>i+D-1)
t.to={-1,-1};
else t.to={i+1,i+D-1};
if(comp(d[i][i+D],t))
d[i][i+D]=t;
}
}
Solve(0,N-1);
return 0;
}