Cod sursa(job #639761)

Utilizator lily3Moldovan Liliana lily3 Data 23 noiembrie 2011 22:09:54
Problema PalM Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include<fstream>
#include<cstring>
using namespace std;

int i,j,n,d[501][501],m,l[501],n2,rez,max1=0,ok1,max2;
char a[501],b[501],c,p[501],t[501];
int main()
{
	ifstream f("palm.in");
	FILE *g=fopen("palm.out","w");
	i=1;
	while(f>>c)
		a[i++]=c;
	n=i-1;
	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]=d[i-1][j-1]+1;
			else
				d[i][j]=max(d[i-1][j],d[i][j-1]);
			i=j=n;
			while(i>=1)
				if(a[i]==b[j])
					p[++m]=a[i],l[m]=(int)p[m-1]-(int)p[m],j--,i--;
				else
					if(d[i-1][j]>d[i][j-1])
						i--;
					else
						j--;
					if(m%2)
						n2=m/2+1;
					else
						n2=m/2;
					/*for(i=1;i<=m;i++)
				fprintf(g,"%c",p[i]);
					fprintf(g,"\n");*/
	int k,mij,pp,n1;
	max1=0,n1=n2;
	for(k=1;k<=n1;++k)
	{
		i=1;
		j=max1;
		pp=0;
		while(i<=j)
		{
			mij=(i+j)/2;
			if(t[mij]>p[k]) 
			{
				pp=mij;
				j=mij-1;
			}
			else 
				if(t[mij]<=p[k]) 
					i=mij+1;
				else 
				{
					pp=mij;
					break;
				}
		}
		if(pp==0) 
		{
			++max1;
			pp=max1;
		}
		else
			n2--;
		t[pp]=p[k];
	}
	//for(i=0;i<=max1;i++)
		//fprintf(g,"%c",t[0]);
	//fprintf(g,"\n");
	//fprintf(g,"%d %d %d\n",max1,n2,m);
//	if((m%2&&max1%2==0)||(max1%2&&m%2==0))//||m%2)
	if(max1==n2)
						fprintf(g,"%d",max1*2-1);
					else
						fprintf(g,"%d",max1*2);
			return 0;
}