Cod sursa(job #2152401)

Utilizator GabiTulbaGabi Tulba-Lecu GabiTulba Data 5 martie 2018 15:01:08
Problema PScPld Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include <bits/stdc++.h>

#define MaxN 1000005
#define INF 2140000000
#define MOD 666013

using namespace std;
FILE *IN=fopen("pscpld.in","r"),*OUT=fopen("pscpld.out","w");

int N,v[2*MaxN],Man[2*MaxN];
long long Ans;
char str[MaxN];

int main()
{
    fscanf(IN,"%s",str+1);

    int N=strlen(str+1);

    for(int i=1;i<=N;i++)
        v[2*i-1]=str[i]-'a'+1;

    Man[0]=1;
    Man[1]=3;
    int M=1;
    Ans=1;
    for(int i=2;i<=2*N;i++)
    {
        if(M+(Man[M]-1)/2<=i+(Man[2*M-i]-1)/2)
        {

            Man[i]=max(1,min(Man[2*M-i],Man[M]-2*(i-M)));
            M=i;
            int P=(Man[M]+1)/2;
            while(M+P<=2*N&&M-P>=0)
            {
                if(v[M+P]==v[M-P])
                    P++,Man[i]+=2;
                else break;
            }
        }
        else Man[i]=Man[2*M-i];
        if(i%2)
            Ans+=(Man[i]+1)/4;
        else Ans+=(Man[i]-1)/4;
    }

    fprintf(OUT,"%lld",Ans);

    return 0;
}