Cod sursa(job #261322)

Utilizator MariusMarius Stroe Marius Data 18 februarie 2009 01:37:12
Problema PScPld Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include <iostream>
#include <fstream>
using namespace std;

const char iname[] = "pscpld.in";
const char oname[] = "pscpld.out";

const int MAXN = 2000005;

#define Min(a, b) ((a) < (b) ? (a) : (b))

char S[MAXN];  int Lg[MAXN];

int main(void) {
    ifstream in(iname);
    char ch;
    int n = 0;

    while (in >> S[2 * n + 1]) {
        Lg[2 * n + 1] = -1;
        n ++;
    }
    in.close();

    ofstream out(oname);
    long long res = 0;
    for (int i = 1; i < 2 * n; ++ i) {
        if ((i & 1) && Lg[i] == -1)
            Lg[i] = 1;

        int j = Lg[i] + 1;
        while (i - j >= 1 && i + j < 2 * n && S[i - j] == S[i + j])
            j += 2;
        j -= 2;
        Lg[i] = j + 1;
        int k = Lg[i];
        while (k <= j) {
            Lg[i + k] = Min(Lg[i - k], j-k+1);
            k ++;
        }
        res += (Lg[i] + 1) / 2;
    }
    out << res;

    in.close(), out.close();
    return 0;
}