Cod sursa(job #1464083)

Utilizator andrettiAndretti Naiden andretti Data 22 iulie 2015 11:56:09
Problema PScPld Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include<stdio.h>
#include<algorithm>
#include<cstring>
#define maxn 1000005
using namespace std;

int n;
char s[maxn];
int p[maxn<<1];
long long sol;

void read()
{
    scanf("%s",s+1);
    n=strlen(s+1);
}

int pal_len(int left,int right)
{
    int nr=0;
    for(;left>0 && right<=n && s[left]==s[right];left--,right++)
     nr+=2;

    return nr;
}

void solve()
{
    int pos,L,R;

    L=R=0;
    for(int i=1;i<=n;i++)
    {
        p[2*i-1]=1;
        if(i<R)
        {
            pos=L+R-i;
            p[2*i-1]=p[pos*2-1];
        }

        if(i+p[2*i-1]/2>R) p[2*i-1]=(R-i)*2;

        if(i+p[2*i-1]/2==R)
          p[2*i-1]+=pal_len(i-p[2*i-1]/2-1,i+p[2*i-1]/2+1);

        if(i+p[2*i-1]/2>R) R=i+p[2*i-1]/2,L=R-p[2*i-1]+1;
        sol+=p[2*i-1]/2+1;

        if(i==n || s[i]!=s[i+1]) continue;

        p[2*i]=2;
        if(i+1<R)
        {
            pos=L+R-i-1;
            p[2*i]=p[pos*2];
        }

        if(i+p[2*i]/2>R) p[2*i]=(R-i)*2;

        if(i+p[2*i]/2==R)
            p[2*i]+=pal_len(i-p[2*i]/2,i+p[2*i]/2+1);

        if(i+p[2*i]/2>R) R=i+p[2*i]/2,L=R-p[2*i]+1;

        sol+=p[2*i]/2;
    }
}

int main()
{
    freopen("pscpld.in","r",stdin);
    freopen("pscpld.out","w",stdout);

    read();
    solve();
    printf("%lld\n",sol);



    fclose(stdin);
    fclose(stdout);
    return 0;
}