Pagini recente » Cod sursa (job #1130018) | Cod sursa (job #1578261) | Cod sursa (job #1279464) | Cod sursa (job #1435375) | Cod sursa (job #2305057)
#include <iostream>
#include <cstdio>
#include <string>
const int MAXN=1000000;
const int BUFF=4096;
using namespace std;
string s;
int z[2*MAXN+5], p=4095;
long long ans=0;
char buff[BUFF];
char nextch( )
{
p++;
if( p==BUFF )
{
p=0;
fread(buff,1,BUFF,stdin);
}
return buff[p];
}
/*char getch( )
{
char c=nextch();
while( c==' ' )
c=nextch();
return c;
}*/
inline int maxim( int a, int b )
{
if( a<b )
a=b;
return a;
}
inline int minim( int a, int b )
{
if( a>b )
a=b;
return a;
}
inline int zet( )
{
int st=0, dr=0;
for( int i=1;i<s.size()-1;i++ )
{
int l;
z[i]=minim(maxim(0,dr-i),z[dr-st+i]);
while( 0<=i-z[i] && i+z[i]<=s.size()-1 && s[i-z[i]]==s[i+z[i]] )
z[i]++;
z[i]--;
ans+=z[i];
if( i+z[i]>dr )
{
st=i-z[i];
dr=i+z[i];
}
}
}
int main()
{
freopen( "pscpld.in", "r", stdin );
freopen( "pscpld.out", "w", stdout );
char c=nextch();
while( c!='\n' )
{
s=s+'*'+c;
c=nextch();
}
s+='*';
zet();
cout<<(ans+s.size()/2)/2;
return 0;
}