Cod sursa(job #478814)

Utilizator freak93Adrian Budau freak93 Data 20 august 2010 14:41:37
Problema PScPld Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

const char iname[]="pscpld.in";
const char oname[]="pscpld.out";
const int maxn=2000005;

char a[maxn],s[maxn];

int l[maxn],x,y,i,n;
long long rez;

int main()
{
    freopen(iname,"r",stdin);
    freopen(oname,"w",stdout);
    fgets(a,sizeof(a),stdin);
    for(i=0;a[i]&&a[i]!='\n';++i)
        s[++n]=a[i],s[++n]='*';
    s[n--]=0;
    l[1]=0;
    rez=1;
    x=y=1;
    for(i=2;i<=n;++i)
    {
        if(i<=y)
        {
            l[i]=min(l[y-i+x],y-i);
            if(l[i]+i==y)
            {
                x=i-l[i];
                while(x>1&&y<n&&s[x-1]==s[y+1])
                    --x,++y,++l[i];
            }
        }
        else
        {
            x=y=i;
            l[i]=0;
            while(x>1&&y<n&&s[x-1]==s[y+1])
                ++l[i],--x,++y;
        }
        if(i&1)
            rez+=(l[i]+2)/2;
        else
            rez+=(l[i]+1)/2;
    }
    printf("%lld\n",rez);
}