Pagini recente » Cod sursa (job #540423) | Cod sursa (job #2116553) | Cod sursa (job #745658) | Cod sursa (job #727611) | Cod sursa (job #1316278)
#include <cstdio>
#include <cstring>
using namespace std;
const int nmax = 1000000;
char a[2*nmax+10];
int p[2*nmax+10];
int n;
void extend(int pos)
{
while(pos - p[pos] > 0 && pos + p[pos] <= n && a[pos - p[pos]] == a[pos + p[pos]])
p[pos]++;
p[pos]--;
}
int main()
{
freopen("pscpld.in", "r", stdin);
freopen("pscpld.out", "w", stdout);
scanf("%s", a+1);
n=strlen(a+1);
for(int i=n; i>=0; i--)
{
a[2*i+1] = '#';
a[2*i] = a[i];
}
n = 2*n+1;
int c = 1;
for(int i=2; i<=n; i++)
{
int i2 = 2*c - i;
int st = c - p[c];
int dr = c + p[c];
if(i > dr)
{
extend(i);
c = i;
}
else
{
if(i2 - p[i2] > st)
p[i] = p[i2];
else
{
p[i] = dr - i;
extend(i);
c = i;
}
}
}
long long ans = 0;
for(int i=1; i<=n; i++)
ans += (long long)p[i]/2;
printf("%lld\n", ans+n/2);
return 0;
}