Cod sursa(job #641344)

Utilizator savimSerban Andrei Stan savim Data 27 noiembrie 2011 22:03:32
Problema PalM Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <fstream>
#include <cstring>
#include <algorithm>

using namespace std;

#define ALF 26

#define MAX_N 510

ifstream f("palm.in");
ofstream g("palm.out");

int n;

int next[ALF][MAX_N], prev[ALF][MAX_N], c[MAX_N][MAX_N];

char s[MAX_N];

void get_next_prev() {
    for (int i = 1; i <= n; i++)
        next[s[i] - 'a'][i] = prev[s[i] - 'a'][i] = i;

    for (int i = 0; i < 26; i++) {
        prev[i][0] = -1;
        for (int j = 1; j <= n; j++)
            if (prev[i][j] == 0)
                prev[i][j] = prev[i][j - 1];

        next[i][n + 1] = n + 1;
        for (int j = n; j > 0; j--)
            if (next[i][j] == 0)
                next[i][j] = next[i][j + 1];
    }
}

int solve() {
    get_next_prev();

    int ans = 0;

    for (int L = 1; L <= n; L++) 
        for (int i = 1; i + L - 1 <= n; i++) {
            int j = i + L - 1;

            if (s[i] == s[j]) {
                int val = 0;
                for (int letter = s[i] - 'a'; letter < 26; letter++)
                    if (next[letter][i + 1] <= prev[letter][j - 1])
                        val = max(val, c[next[letter][i + 1]][prev[letter][j - 1]]);

                c[i][j] = val + 1 + (i != j);

                if (next[s[i] - 'a'][i + 1] <= j)
                    c[i][j] = max(c[i][j], c[next[s[i] - 'a'][i + 1]][j]);
                if (i <= prev[s[j] - 'a'][j - 1])
                    c[i][j] = max(c[i][j], c[i][prev[s[j] - 'a'][j - 1]]);

                ans = max(ans, c[i][j]);
            }
        }

    return ans;
}

int main() {

    f >> (s + 1); s[0] = ' '; n = strlen(s) - 1;

    g << solve() << "\n";

    return 0;
}