Pagini recente » Cod sursa (job #602124) | Cod sursa (job #3191791) | Cod sursa (job #134344) | Cod sursa (job #254887) | Cod sursa (job #1464083)
#include<stdio.h>
#include<algorithm>
#include<cstring>
#define maxn 1000005
using namespace std;
int n;
char s[maxn];
int p[maxn<<1];
long long sol;
void read()
{
scanf("%s",s+1);
n=strlen(s+1);
}
int pal_len(int left,int right)
{
int nr=0;
for(;left>0 && right<=n && s[left]==s[right];left--,right++)
nr+=2;
return nr;
}
void solve()
{
int pos,L,R;
L=R=0;
for(int i=1;i<=n;i++)
{
p[2*i-1]=1;
if(i<R)
{
pos=L+R-i;
p[2*i-1]=p[pos*2-1];
}
if(i+p[2*i-1]/2>R) p[2*i-1]=(R-i)*2;
if(i+p[2*i-1]/2==R)
p[2*i-1]+=pal_len(i-p[2*i-1]/2-1,i+p[2*i-1]/2+1);
if(i+p[2*i-1]/2>R) R=i+p[2*i-1]/2,L=R-p[2*i-1]+1;
sol+=p[2*i-1]/2+1;
if(i==n || s[i]!=s[i+1]) continue;
p[2*i]=2;
if(i+1<R)
{
pos=L+R-i-1;
p[2*i]=p[pos*2];
}
if(i+p[2*i]/2>R) p[2*i]=(R-i)*2;
if(i+p[2*i]/2==R)
p[2*i]+=pal_len(i-p[2*i]/2,i+p[2*i]/2+1);
if(i+p[2*i]/2>R) R=i+p[2*i]/2,L=R-p[2*i]+1;
sol+=p[2*i]/2;
}
}
int main()
{
freopen("pscpld.in","r",stdin);
freopen("pscpld.out","w",stdout);
read();
solve();
printf("%lld\n",sol);
fclose(stdin);
fclose(stdout);
return 0;
}