Pagini recente » Cod sursa (job #2678709) | Cod sursa (job #2952781) | Cod sursa (job #2795975) | Cod sursa (job #2652080) | Cod sursa (job #790162)
Cod sursa(job #790162)
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define maxn 1000005
long n,i,Dif;
char Text[maxn];
long Rez[2*maxn];
long Last[2*maxn];
long long rez;
int main()
{
freopen ("pscpld.in","r",stdin);
freopen ("pscpld.out","w",stdout);
scanf ("%s", &Text );
n=strlen(Text);
for ( i=0; i<2*n; i++ )
{
if ( i%2==0 )
{
Dif= Last[Dif];
for ( ; ( ( Text[ (i>>1)-Dif ] == Text[ (i>>1)+Dif ] ) && ( (i>>1)-Dif>=0 ) && ( (i>>1)+Dif<n ) ); Dif++ )
if ( !Last[ i + 2*Dif ] )
Last[ i + 2*Dif ] = Last[ i - 2*Dif ];
Rez [ i ]= Dif;
}
else{
Dif= Last[Dif];
for ( ; ( ( Text[ (i>>1)-Dif ] == Text[ (i>>1)+Dif+1 ] ) && ( (i>>1)-Dif>=0 ) && ( (i>>1)+Dif+1<n ) ); Dif++ )
if ( !Last[ i + 2*Dif ] )
Last[ i + 2*Dif ] = Rez[ i - 2*Dif ];
Rez [ i ] = Dif;
}
}
for ( i=0; i<2*n; i++ )
rez+=Rez[i];
cout<<rez<<"\n";
return 0;
}