Cod sursa(job #263735)

Utilizator Mishu91Andrei Misarca Mishu91 Data 20 februarie 2009 19:34:23
Problema PScPld Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.85 kb
#include <fstream>

using namespace std;

#define MAX_N 2000004

ifstream fin ("pscpld.in");
ofstream fout ("pscpls.out");

char S[MAX_N];
int N, bst = 1, L[MAX_N];
long long Sol;

inline int Min(const int a, const int b)
{
    return ((a) < (b)) ? (a) : (b);
}

void citire()
{
    for(N = 2; fin >> (S[N - 1]); N += 2);
    N -= 2;
    if(S[N - 1] == '\n')
        N -= 2;
}

void solve()
{
    for(int i = 1; i < N; ++i)
    {
        if(bst + L[bst] - 1 < i)
            L[i] = (i & 1);
        else
            L[i] = Min(L[2 * bst - i], bst + L[bst] - i);
            
        int j = L[i] + 1;

        while(i - j > 0 && i + j <= N && S[i + j] == S[i - j])
            j += 2;

        L[i] = j - 1;

        if(i + L[i] > bst + L[bst])
            bst = i;
        Sol += (L[i] + 1) >> 1;
    }
    fout << Sol;
}

int main()
{
    citire();
    solve();
}