Cod sursa(job #637611)

Utilizator excelsiorExcelsior excelsior Data 20 noiembrie 2011 15:34:04
Problema PalM Scor 10
Compilator cpp Status done
Runda .com 2011 Marime 1.66 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 maxim,i;
    for(i=0;i<=50;i++)
    {
        h[i]=0;
        hi[i]=0;
    }
    for(i=1;i<=N;i++)
    {
       maxim=maxi(a[v[i].p],v[i].p,v[i].s);
       dp[i]=maxim+((v[i].s==v[i].p)?1:2);
       update(a[v[i].p],dp[i],i);
       ans=max(ans,dp[i]);
       //cout<<maxim<<" "<<((v[i].s==v[i].p)?1:2)<<" "<<dp[i]<<"\n";
    }
    /*cout<<"\n";
    for(i=0;i<=50;i++)
    {
        cout<<h[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<<"\n";
    }*/
}

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

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