Cod sursa(job #637155)

Utilizator elfusFlorin Chirica elfus Data 20 noiembrie 2011 12:26:07
Problema PalM Scor 40
Compilator cpp Status done
Runda .com 2011 Marime 1.94 kb
#include <stdio.h>
#include <string.h>
#define LMAX 1 << 9

int D[2][LMAX], last[LMAX], x[LMAX];
char s[LMAX];
bool used[LMAX];

int main ()
{
    int N, i, j, it, k;

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

    gets (s + 1);
    N = strlen (s + 1);
    for (i = 1; i <= N; i ++)
        x[i] = s[i] - 'a';

    for (i = 1; i <= N; i ++)
    {
        for (j = i - 1; j >= 1; j --)
            if (x[j] <= x[i] && ((D[0][i] == 0 && D[1][i] == 0) || D[1][j]))
            {
                if (!last[j])
                    last[j] = N;
                for (k = last[j] - 1; k >= i + 1; k --)
                    if (x[k] == x[i] && !used[k])
                        break;
                if (k < i)
                    continue;
                if (k == i && !D[1][i])
                {
                    if (D[1][j] + 1 > D[0][i])
                    {
                        D[0][i] = D[1][j] + 1;
                        used[k] = 1;
                    }
                }
                else
                    if (D[1][j] + 2 > D[1][i])
                    {
                        D[1][i] = D[1][j] + 2;
                        last[i] = k;
                        used[i] = used[k] = 1;
                    }
            }
        if (D[0][i] == 0 && D[1][i] == 0)
        {
            for (j = N; j >= i + 1; j --)
                if (x[j] == x[i])
                    break;
            if (j == i)
            {
                D[0][i] = 1;
                used[j] = 1;
            }
            else
            {
                D[1][i] = 2;
                used[i] = used[j] = 1;
                last[i] = j;
            }
        }
    }

    int max = 0;

    for (i = 1; i <= N; i ++)
    {
        if (D[0][i] > max)
            max = D[0][i];
        if (D[1][i] > max)
            max = D[1][i];
    }

    printf ("%d", max);
    return 0;
}