Cod sursa(job #1883764)

Utilizator Vlad1111Sbengheci Vlad-Andrei Vlad1111 Data 18 februarie 2017 10:57:19
Problema PScPld Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include <iostream>
#include <cstdio>
#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("manacher.in","r",stdin);
    freopen("manacher.out","w",stdout);

    a[n++]='#';
    while(!feof(stdin))
    {
        scanf("%c",&x);
        if(x>='a' && x<='z')
        {
            a[n++]=x;
            a[n++]='#';
        }
    }
    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;
}