Pagini recente » Cod sursa (job #1994837) | Cod sursa (job #2571138) | Cod sursa (job #2192509) | Cod sursa (job #1213183) | Cod sursa (job #2035906)
#include <bits/stdc++.h>
#define MaxN 705
#define INF 2140000000
#define MOD 1000000007
using namespace std;
FILE*IN,*OUT;
int N;
struct dynamic
{
int L;
char Digit;
pair<int,int>to;
}d[MaxN][MaxN];
char str[MaxN],out[MaxN];
bool comp(dynamic a,dynamic b)
{
return a.L<b.L||(a.L==b.L&&a.Digit<b.Digit);
}
void Solve(int i,int j)
{
fprintf(OUT,"%c",d[i][j].Digit);
if(d[i][j].to!=make_pair(0,0))
Solve(d[i][j].to.first,d[i][j].to.second);
if(d[i][j].L>1)
fprintf(OUT,"%c",d[i][j].Digit);
}
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={0,0};
}
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={0,0};
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;
}