Cod sursa(job #1345756)

Utilizator PikachuPikachu Pikachu Data 17 februarie 2015 20:48:52
Problema PScPld Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <fstream>
#include <string>
#include <cstring>

using namespace std;

const int NMAX = 1000000;

int p[2000005], n;
string v, s;

inline void solve(int poz) {
    while(poz - p[poz] >= 0 && poz + p[poz] < n && v[poz - p[poz]] == v[poz + p[poz]])
        ++ p[poz];
    -- p[poz];
}

int main() {
    ifstream in("pscpld.in");
    ofstream out("pscpld.out");

    int j = 0, aux, st, dr;
    long long rasp = 0;

    in >> s;
    n = s.length();

    for(int i = 0; i < n; ++ i) {
        v = v + "#" + s[i];
    }

    v += "#";

    n = n * 2 + 1;

    for(int i = 1; i < n - 1; ++ i) {
        aux = 2 * j - i;
        st = j - p[j];
        dr = j + p[j];
        if( i > dr ) {
            solve(i);
            j = i;
        } else
        if( aux - p[aux] > st ) {
            p[i] = p[aux];
        } else {
            p[i] = dr - i;
            solve(i);
            j = i;
        }
        rasp += (p[i] + 1) / 2;
    }

    out << rasp;

    return 0;
}