Pagini recente » Cod sursa (job #402746) | Cod sursa (job #146983) | Cod sursa (job #822631) | Cod sursa (job #595550) | Cod sursa (job #893945)
Cod sursa(job #893945)
#include<cstring>
#include<cstdio>
#define NMAX 1000000+5
using namespace std;
char s[NMAX];
int i,j,l,r,p[2*NMAX],q[2*NMAX],n,t;
long long sol;
int main()
{
freopen("pscpld.in","r",stdin);
freopen("pscpld.out","w",stdout);
scanf("%s",s+1);
n=strlen(s+1);
s[0]='*'; s[n+1]='#';
p[1]=1; sol=1;
if(s[1]==s[2]) p[2]=2;
for(t=2;t<=n;t++)
{
i=2*t-1;
if(q[j]) {l=(i-p[q[i]]+2)/2; r=p[q[i]]-1+l;}
else l=r=t;
for(;s[l]==s[r];l--,r++)
{
if(p[2*l-1]>p[q[2*r-1]]) q[2*r-1]=2*l-1;
if(p[2*l]>p[q[2*r]]) q[2*r]=2*l;
}
l++, r--;
p[i]=r-l+1;
sol+=(p[i]+1)/2;
i=2*t;
if(q[j]) {l=(i-p[q[i]]+2)/2; r=p[q[i]]-1+l;}
else {l=t; r=t+1;}
for(;s[l]==s[r];l--,r++)
{
if(p[2*l-1]>p[q[2*r-1]]) q[2*r-1]=2*l-1;
if(p[2*l]>p[q[2*r]]) q[2*r]=2*l;
}
l++, r--;
p[i]=r-l+1;
sol+=(p[i]+1)/2;
}
/*for(i=1;i<=2*n-1;i++) printf("%d ",p[i]);
printf("\n");
for(i=1;i<=2*n-1;i++) printf("%d ",q[i]);
printf("\n");*/
printf("%lld\n",sol);
return 0;
}