Cod sursa(job #637792)

Utilizator excelsiorExcelsior excelsior Data 20 noiembrie 2011 16:42:53
Problema PalM Scor 90
Compilator cpp Status done
Runda .com 2011 Marime 1.75 kb

using namespace std;
#include<iostream>
#include<fstream>
#include<cstring>
ofstream fout("palm.out");
char a[510];
int N;
struct nod{
int p,s;};
nod v[260100];
int dp[260100];
//int h[100],hi[100];

/*int maxi(char dummy,int p,int s)
{
    int castu;
    castu=(int)(dummy-'a');
    int ans=0,i;
    for(i=0;i<=castu;i++)
    {
        if(hi[i]==0 || (p>v[hi[i]].p && s<v[hi[i]].s) )
        ans=max(ans,h[i]);
    }
    return ans;
}

void update(char dummy,int value,int i)
{
    int castu;
    castu=(int)(dummy-'a');
    h[castu]=max(value,h[castu]);
    if(h[castu]==value)
    hi[castu]=i;
}*/
void scmax()
{
    int ans=0;
    int i,j;
    N=min(N,10000);
    for(i=1;i<=N;i++)
    {
        dp[i]=0;
       for(j=1;j<i;j++)
       {
           if(a[v[i].p]<a[v[j].p])
           continue;
           if(v[i].p<=v[j].p)
           continue;
           if(v[i].s<v[j].s)
           dp[i]=max(dp[i],dp[j]);
       }
       dp[i]+=((v[i].p==v[i].s)?1:2);
       ans=max(ans,dp[i]);
    }
   /* cout<<"\n";
    for(i=0;i<=50;i++)
    {
        cout<<h[i]<<" ";
    }
    cout<<"\n";
     for(i=0;i<=50;i++)
    {
        cout<<hi[i]<<" ";
    }
    cout<<"\n";*/
    fout<<ans<<"\n";
}

void build()
{
    int i,j,M=0;
    for(i=1;i<=N;i++)
    {
        for(j=1;j<=N-i;j++)
        {
            if(a[i]==a[N-j+1])
            {
                v[++M].p=i;
                v[M].s=N-j+1;
            }
        }
    }
    for(i=1;i<=N;i++)
    {
        v[++M].p=i;
        v[M].s=i;
    }
    N=M;
   /* for(i=1;i<=N;i++)
    {
        cout<<v[i].p<<" "<<v[i].s<<" "<<a[v[i].s]<<"\n";
    }*/
}

void cit()
{
    ifstream fin("palm.in");
    fin.getline(a+1,505);
    N=strlen(a+1);
    fin.close();
}

int main()
{
    cit();
    build();
    scmax();
    fout.close();
    return 0;
}