Cod sursa(job #636806)

Utilizator ChallengeMurtaza Alexandru Challenge Data 19 noiembrie 2011 23:56:18
Problema PalM Scor 100
Compilator cpp Status done
Runda .com 2011 Marime 1.18 kb
#include <fstream>
#include <cstring>

using namespace std;

const char InFile[]="palm.in";
const char OutFile[]="palm.out";
const int MaxN=512;
const int SIGMA=32;

ifstream fin(InFile);
ofstream fout(OutFile);

int N,sol,AIB2D[MaxN][SIGMA];
char S[MaxN];

inline int LSB(const int &x)
{
	return x&-x;
}

inline void AIB2DUpdate(const int &x, const int &y, const int &val)
{
	for(register int i=x;i<=N;i+=LSB(i))
	{
		for(register int j=y;j<SIGMA;j+=LSB(j))
		{
			AIB2D[i][j]=max(AIB2D[i][j],val);
		}
	}
}

inline int AIB2DQuery(const int &x, const int &y)
{
	int sol=0;
	for(register int i=x;i>0;i-=LSB(i))
	{
		for(register int j=y;j>0;j-=LSB(j))
		{
			sol=max(sol,AIB2D[i][j]);
		}
	}
	return sol;
}

int main()
{
	fin>>(S+1);
	fin.close();

	N=strlen(S+1);
	for(register int i=1;i<=N;++i)
	{
		S[i]=SIGMA-(1+S[i]-'a');
	}
	for(register int i=N;i>0;--i)
	{
		for(register int j=N;j>=i;--j)
		{
			if(i==j)
			{
				sol=max(sol,1);
				AIB2DUpdate(j+1,S[i],1);
			}
			else if(S[i]==S[j])
			{
				int x=2+AIB2DQuery(j,S[i]);
				sol=max(sol,x);
				AIB2DUpdate(j+1,S[i],x);
			}
		}
	}

	fout<<sol;
	fout.close();
	return 0;
}