Cod sursa(job #598448)

Utilizator c_sebiSebastian Crisan c_sebi Data 25 iunie 2011 19:31:47
Problema PScPld Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
//S.C.
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

char s[2100000];
int P[2100000];

int main()
{

    ifstream f("pscpld.in");
    f >> s;
    int i, j, n, m;
    long long sum = 0;
    n = strlen(s);
    for(i = 2*n-1; i >= 0; i--){
        if(i%2)
            s[i] = '#';
        else s[i] = s[i/2];
    }
    cout << s << endl;
    P[0] = 0;
    m = 1;
    for(i = 1; i <= 2*n - 1; i++){
        j = 0;
        if(m >= i){
            j = P[m - i];
            if(j > m + P[m] - i)
                j = m + P[m] - i;
        }
        P[i] = j;
        while(i - P[i] - 1 >= 0 && i + P[i] + 1 <= 2*n - 1 && s[i + P[i] + 1] == s[i - P[i] - 1])
            P[i]++;
        if(i + P[i] > m)
            m = i + P[i];
        if(i%2)
            sum += P[i] / 2;
        else sum += P[i]/2 + 1;
        cout << P[i] << " ";
    }
    sum++;
    ofstream g("pscpld.out");
    g << sum << endl;
    return 0;
}