Pagini recente » Cod sursa (job #876589) | Cod sursa (job #2340843) | Cod sursa (job #256720) | Cod sursa (job #1753469) | Cod sursa (job #2417340)
#include <bits/stdc++.h>
using namespace std;
char s1[1000010],s[1000010];
int d[2000010];
int main()
{
freopen("pscpld.in","r",stdin);
freopen("pscpld.out","w",stdout);
int n=0;
scanf("%s",s1+1);
int l=strlen(s1+1);
for(int i=1;i<=l;i++)
{
s[++n]=s1[i];
s[++n]='*';
}
n--;
int lmax=0,poz=0;
for(int i=1;i<=n;i++)
{
if(i+d[i]<poz+lmax) d[i]=min(poz+lmax-i,d[2*poz-i]);
if(i+d[i]>=poz+lmax) while(i+d[i]<n && i-d[i]>1 && s[i+d[i]+1]==s[i-d[i]-1]) d[i]++;
if(i+d[i]>poz+lmax) {poz=i;lmax=d[i];}
}
long long ans=0;
for(int i=1;i<=n;i++)
if(s[i]=='*') ans+=(d[i]+1)/2;
else ans+=d[i]/2+1;
printf("%lld",ans);
return 0;
}