Cod sursa(job #1316278)

Utilizator killer301Ioan Andrei Nicolae killer301 Data 13 ianuarie 2015 18:05:16
Problema PScPld Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <cstdio>
#include <cstring>

using namespace std;

const int nmax = 1000000;

char a[2*nmax+10];
int p[2*nmax+10];
int n;

void extend(int pos)
{
    while(pos - p[pos] > 0 && pos + p[pos] <= n && a[pos - p[pos]] == a[pos + p[pos]])
        p[pos]++;
    p[pos]--;
}

int main()
{
    freopen("pscpld.in", "r", stdin);
    freopen("pscpld.out", "w", stdout);
    scanf("%s", a+1);
    n=strlen(a+1);

    for(int i=n; i>=0; i--)
    {
        a[2*i+1] = '#';
        a[2*i] = a[i];
    }
    n = 2*n+1;
    int c = 1;
    for(int i=2; i<=n; i++)
    {
        int i2 = 2*c - i;
        int st = c - p[c];
        int dr = c + p[c];
        if(i > dr)
        {
            extend(i);
            c = i;
        }
        else
        {
            if(i2 - p[i2] > st)
                p[i] = p[i2];
            else
            {
                p[i] = dr - i;
                extend(i);
                c = i;
            }
        }
    }
    long long ans = 0;
    for(int i=1; i<=n; i++)
        ans += (long long)p[i]/2;
    printf("%lld\n", ans+n/2);
    return 0;
}