Cod sursa(job #894691)

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