Cod sursa(job #894543)

Utilizator mirceadinoMircea Popoveniuc mirceadino Data 26 februarie 2013 21:54:15
Problema PScPld Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include<cstring>
#include<cstdio>
#define NMAX 1000000+5
using namespace std;
char s[NMAX];
int i,j,l,r,p[2*NMAX],n,t;
long long sol;
int main()
{
    freopen("pscpld.in","r",stdin);
    freopen("pscpld.out","w",stdout);
    scanf("%s",s+1);
    n=strlen(s+1);
    s[0]='*'; s[n+1]='#';
    for(t=1;t<=n;t++)
    {
        i=2*t-1;
        if(p[i]) {l=(i-p[p[i]]+2)/2; r=p[p[i]]-1+l;}
        else l=r=t;
        for(;s[l]==s[r];l--,r++)
        {
            if(p[2*l-1]>p[p[2*r-1]]) p[2*r-1]=2*l-1;
            if(p[2*l]>p[p[2*r]]) p[2*r]=2*l;
        }
        l++, r--;
        p[i]=r-l+1;
        sol+=(p[i]+1)/2;
        i=2*t;
        if(p[i]) {l=(i-p[p[i]]+2)/2; r=p[p[i]]-1+l;}
        else {l=t; r=t+1;}
        for(;s[l]==s[r];l--,r++)
        {
            if(p[2*l-1]>p[p[2*r-1]]) p[2*r-1]=2*l-1;
            if(p[2*l]>p[p[2*r]]) p[2*r]=2*l;
        }
        l++, r--;
        p[i]=r-l+1;
        sol+=(p[i]+1)/2;
    }
    /*for(i=1;i<=2*n-1;i++) printf("%d ",p[i]);
    printf("\n");
    for(i=1;i<=2*n-1;i++) printf("%d ",q[i]);
    printf("\n");*/
    printf("%lld\n",sol);
    return 0;
}