Cod sursa(job #790324)

Utilizator deneoAdrian Craciun deneo Data 20 septembrie 2012 21:24:59
Problema PScPld Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <fstream>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

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

#define MAXN 1100000

int v[2 * MAXN], n;
char sir[2 * MAXN];
long long rez;

void extinde() {
    for (int i = 2 * n + 1; i > 0; --i) {
        if (i % 2 == 1)
            sir[i] = '@';
        else
            sir[i] = sir[i / 2];
    }
    n = 2 * n + 1;
}

void doPscPld() {
    int best = 0;
    for (int i = 1; i <= n; ++i) {
        if (best + v[best] >= i) 
            v[i] = min(best + v[best] - i, v[best * 2 - i]);
        while (i + v[i] <= n && i - v[i] > 0 && sir[i + v[i]] == sir[i - v[i]])
            ++v[i];
        if (i + v[i] > best + v[best])
            best = i;
          }
} 

int main() {
    int i;
    fin.getline(sir + 1, MAXN);
    n = strlen(sir + 1);
    extinde();
    doPscPld();
    for (i = 1; i <= 2 * n + 1; ++i) 
        if (i % 2 == 1)
            rez += (v[i] - 1) / 2;
        else
            rez += v[i] / 2;
    fout << rez << "\n";
    return 0;
}