Cod sursa(job #635930)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 19 noiembrie 2011 15:42:50
Problema PalM Scor 100
Compilator cpp Status done
Runda .com 2011 Marime 0.82 kb
#include <cstdio>
#include <cstring>
#define nmax 510

char s[nmax];
short n, dr[30][nmax], st[30][nmax], v[nmax][nmax][30];

int main()
{
	freopen("palm.in","r",stdin);
	freopen("palm.out","w",stdout);
	fgets(s, nmax, stdin);
	n=strlen(s);
	int i, j, d, c, x, y;
	for (i=n; i>0; i--) s[i]=s[i-1]-'a'+1;
	for (c=1; c<=26; c++) 
	{
		for (i=1; i<=n; i++)
			if (s[i]==c) st[c][i]=i; else st[c][i]=st[c][i-1];
		dr[c][n+1]=nmax;
		for (i=n; i>0; i--)
			if (s[i]==c) dr[c][i]=i; else dr[c][i]=dr[c][i+1];
	}
	for (d=1; d<=n; d++)
		for (i=1; i+d-1<=n; i++)
		{
			j=i+d-1;
			for (c=26; c>0; c--)
			{
				x=dr[c][i];
				y=st[c][j];
				if (x<y) v[i][j][c]=v[x+1][y-1][c]+2; else
				if (x==y) v[i][j][c]=1;
				if (v[i][j][c+1]>v[i][j][c]) v[i][j][c]=v[i][j][c+1];
			}
		}
	printf("%d\n",v[1][n][1]);
}