Pagini recente » Cod sursa (job #2015209) | Cod sursa (job #2031867) | Cod sursa (job #1182451) | Cod sursa (job #2015601) | Cod sursa (job #2181528)
#include <cstdio>
#include <cctype>
#include <cstring>
using namespace std;
char v[2000005],aux[1000005];
int rez[2000005];
/// TONI BO$$ was here
/// #MLC
int main()
{
int n,fl,i,c,r,j,a,b;
long long sum=0;
freopen("pscpld.in","r",stdin);
freopen("pscpld.out","w",stdout);
gets(aux);
n=strlen(aux)-1;
for(i=0; i<=n; i++)
{
v[2*i]='$';
v[2*i+1]=aux[i];
}
v[2*i]='$';
n=2*i+1;
c=1;
r=2;
rez[1]=1;
for(j=2; j<n; j++){
i=2*c-j;
if(j>=r){
a=j-1;
b=j+1;
while(a>0 && b<n){
if(v[a]==v[b])
a--,b++,rez[j]++;
else
break;}
c=j;
r=c+rez[c];
continue ;
}
if(rez[i]<r-j){
rez[j]=rez[i];
continue ;
}
rez[j]=r-j;
a=j-rez[j]-1;
b=r+1;
while(a>0 && b<n){
if(v[a]==v[b])
a--,b++,rez[j]++;
else
break;}
if(r<j+rez[j]){
c=j;
r=c+rez[c];
}
}
for(i=1; i<n; i++)
sum+=((long long)rez[i]+1)/2;
printf("%lld",sum);
return 0;
}