Cod sursa(job #1756886)

Utilizator silkMarin Dragos silk Data 13 septembrie 2016 20:38:35
Problema PalM Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <cstdio>
#include <cstring>
#define NMax 505
#define Type 256
#define MIN(a,b)((a)<(b)?(a):(b))

char s[NMax+1];
int pos_st[NMax+1][Type+1];
int pos_dr[NMax+1][Type+1];
int ultim[2][NMax+1];
int ap[Type+1];
int N,ans;

void Solve(int v)
{
    int i,j,z,l,ok=v%2,t=0;

    for(i = 0; i <= 1; ++i)
        for(j = 1; j <= N; ++j) ultim[i][j] = 0;

    if(v%2)
        for(i = 1; i <= N; ++i) { ultim[0][i] = i; }
    else
        for(i = 1; i <= N; ++i)
        if( pos_dr[i][ s[i] ] ) { ultim[0][i] = pos_dr[i][ s[i] ]; ok = 1; t = 1; }

    for(l = 1, i = 2+v; i <= N && ok; i+=2, l=1-l)
    {
        ok = 0;
        for(j = 1; j <= N; ++j)
            for(z = 'a'; z <= s[j]; ++z)
            if( ultim[1-l][j] && pos_st[j][z] && pos_dr[ ultim[1-l][j] ][z] )
            {
                if( ultim[l][ pos_st[j][z] ] ) ultim[l][ pos_st[j][z] ] = MIN( pos_dr[ ultim[1-l][j] ][z], ultim[l][ pos_st[j][z] ] );
                else ultim[l][ pos_st[j][z] ] = pos_dr[ ultim[1-l][j] ][z];
                ok = 1;
            }
        for(j = 1; j <= N; ++j) ultim[1-l][j] = 0;
        if(!ok) break;
    }
    if(i==4) { if(2>ans && t) ans = 2; }
    else if(i-2>ans) ans = i-2;
}

int main(){
    freopen("palm.in","r",stdin);
    freopen("palm.out","w",stdout);

    int i,z;

    s[0] = 1;
    fgets( s+1, NMax, stdin );
    N = strlen(s)-1;
    if( s[N]=='\n' ) --N;

    for(i = 1; i <= N; ++i)
    {
        for(z = 'a'; z <= 'z'; ++z) pos_st[i][z] = ap[z];
        ap[ s[i] ] = i;
    }

    memset( ap, 0, sizeof(ap) );
    for(i = N; i >= 1; --i)
    {
        for(z = 'a'; z <= 'z'; ++z) pos_dr[i][z] = ap[z];
        ap[ s[i] ] = i;
    }

    Solve(1);
    Solve(2);

    printf("%d\n",ans);




return 0;
}