Cod sursa(job #2510011)

Utilizator NaritaandreiCNAINarita Andrei NaritaandreiCNAI Data 15 decembrie 2019 16:26:37
Problema PScPld Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
FILE *f,*g;
char s[2000004],t[1000004];
int n,lps[2000004];
long long sol;
void read()
{   int lg;
    fscanf(f,"%s",&t);
    lg=strlen(t);
    s[0]='#';
    for(int i=0;i<lg;i++)
    {
        s[++n]=t[i];
        s[++n]='#';
    }
    sol=lg;
}
void solve()
{
    int r=1,c=1,ii,expand;
    lps[1]=1;
    lps[0]=0;
    for(int i=2;i<=n;i++)
    {
        ii=2*c-i;
        expand=0;
        if(r<=i)
        {
            lps[i]=0;
            expand=1;
        }
        else
        {
            if(lps[ii]<r-i)
                lps[i]=lps[ii];
            else
            {
                lps[i]=min(r-i,lps[ii]);
                expand=1;
            }
        }
        if(expand)
        {
            while(i-lps[i]>0 && i+lps[i]<n)
            {
                if((i-lps[i]-1)%2==0)
                    lps[i]++;
                else
                {
                    if(s[i-lps[i]-1]==s[i+lps[i]+1])
                        lps[i]++;
                    else
                        break;
                }
            }
        }
        if(r<i+lps[i])
        {
            r=i+lps[i];
            c=i;
        }
        sol+=1ll*lps[i]/2;
    }
}
void write()
{
    fprintf(g,"%lld",sol);
}
int main()
{
    f=fopen("pscpld.in","r");
    g=fopen("pscpld.out","w");
    read();
    solve();
    write();
    fclose(f);
    fclose(g);
    return 0;
}