Cod sursa(job #1464119)

Utilizator andrettiAndretti Naiden andretti Data 22 iulie 2015 13:16:39
Problema PScPld Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include<stdio.h>
#include<algorithm>
#include<cstring>
#define maxn 1000005
using namespace std;

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

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

    int nr=0;
    for(int i=1;i<=n;i++)
     s[++nr]='#',s[++nr]=aux[i];

    s[++nr]='#';
    n=nr;
}

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

    return nr;
}

void solve()
{
    int pos,C,R;
    C=R=0;
    for(int i=1;i<=n;i++)
    {
        if(i<=R)
        {
            pos=2*C-i;
            p[i]=min(p[pos],R-i);
        }

        p[i]+=pal_len(i-p[i]-1,i+p[i]+1);
        if(i+p[i]>=R) R=i+p[i],C=i;

        if(i==1 || i==n) continue;
        sol+=p[i]/2;
        if(s[i]=='#' && p[i]%2==0) continue;
        sol++;
    }
}

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

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

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