Cod sursa(job #998579)

Utilizator geniucosOncescu Costin geniucos Data 17 septembrie 2013 17:56:47
Problema PScPld Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.71 kb
#include<cstdio>
#include<cstring>
using namespace std;
int n,i,P,R,dp[1000009];
long long rez;
char sir[1000009];
int main()
{
freopen("pscpld.in","r",stdin);
freopen("pscpld.out","w",stdout);
gets(sir+1);
n=strlen(sir+1);
R=0;
for(i=1;i<=n;i++)
{
    if(R>=i) dp[i]=dp[P-(i-P)];
    while(sir[i-dp[i]]==sir[i+dp[i]]&&i>dp[i]&&i+dp[i]<=n) dp[i]++;
    if(i+dp[i]-1>R)
    {
        R=i+dp[i]-1;
        P=i;
    }
    rez+=dp[i];
}
R=0;
for(i=1;i<n;i++)
{
    dp[i]=0;
    if(R>i) dp[i]=dp[P-(i-P)];
    while(sir[i-dp[i]]==sir[i+dp[i]+1]&&i>dp[i]&&i+dp[i]+1<=n) dp[i]++;
    if(i+dp[i]>R)
    {
        R=i+dp[i];
        P=i;
    }
    rez+=dp[i];
}
printf("%lld\n",rez);
return 0;
}