Cod sursa(job #1883788)

Utilizator Vlad1111Sbengheci Vlad-Andrei Vlad1111 Data 18 februarie 2017 11:04:07
Problema PScPld Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <iostream>
#include <cstdio>
#include <string.h>
#define cout cerr
#define MAX 2000005
using namespace std;

char a[MAX],x;
int n=1,R,C;
long long pal[MAX];
long long S;

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

    a[n++]='#';
    while(!feof(stdin))
    {
        scanf("%c",&x);
        if(x>='a' && x<='z')
        {
            a[n++]=x;
            a[n++]='#';
        }
    }
    /*scanf("%s",a+1);*/
    //n=strlen(a);
    pal[1]=0;
    pal[2]=1;
    C=1,R=1;
    S=1;
    for(int i=3;i<n;i++)
    {
        int l=i-C;
        int ii=2*C-i;
        if(pal[ii]<R-l)
            pal[i]=pal[ii];
        else
            {pal[i]=min(pal[ii],(long long)(R-l));

        while(pal[i]+i+1<n && i-pal[i]-1>0
            && a[pal[i]+i+1]==a[i-pal[i]-1])
                pal[i]++;}

        if(l>R)
        {
            C=i;
            R=pal[C];
        }
        S+=(pal[i]+1)/2;
    }
    /*for(int i=1;i<n;i++)
        cout<<a[i]<<" "<<pal[i]<<endl;**/
    printf("%d",S);
    return 0;
}