Cod sursa(job #637238)

Utilizator iulishorIulian Popescu iulishor Data 20 noiembrie 2011 13:20:45
Problema PalM Scor 40
Compilator cpp Status done
Runda .com 2011 Marime 1.2 kb
#include<fstream>
#include<algorithm>
using namespace std;
char a[501],b[501];
int d[1024][1024];
char sir[501],l[501];
int bst,bst1;
int main()
{
    int i=1, j;
    ifstream f("palm.in");
    ofstream g("palm.out");
	char c;
	while(f>>c)
		a[i]=c,++i;
	int n=i;
	for(i=1;i<=n;++i)
		b[n-i]=a[i];
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            if(a[i]==b[j])
                d[i][j]=1+d[i-1][j-1];
            else
                d[i][j]=max(d[i-1][j],d[i][j-1]);
    i=n;
	j=n;
	bst=0;
	while(i)
        if (a[i]==b[j] )
		{
            sir[bst++]=a[i];
			--i;
			--j;
		}
        else 
			if (d[i-1][j]<d[i][j-1])
				--j;
			else
				--i;
	if((bst-1)%2==0)
		bst=(bst-1)/2;
	else
		bst=(bst-1)/2+1;
	int poz[501];
	int k,m,p,pp;
	p=0;
	for(k=1;k<=bst;++k)
	{
		i=1;
		j=p;
		pp=0;
		while(i<=j)
		{
			m=(i+j)/2;
			if(l[m]>sir[k]) 
			{
				pp=m;
				j=m-1;
			}
			else 
				if(l[m]<=sir[k]) 
					i=m+1;
				else 
				{
					pp=m;
					break;
				}
		}
		
		if(pp==0) 
		{
			++p;
			pp=p;
		}
		l[pp]=sir[k];
		poz[k]=pp;
	}
	bst1=bst;
	for(i=p;i>=0;--i)
	{
		while(poz[bst]!=i && bst)
			--bst;
		l[i]=sir[bst];
	}
	if(bst1%2==0)
		g<<p*2;
	else
		g<<p*2-1;
    return 0;
}