Pagini recente » Cod sursa (job #2861469) | Cod sursa (job #1978849) | Cod sursa (job #2155122) | Cod sursa (job #472507) | Cod sursa (job #114326)
Cod sursa(job #114326)
#include <stdio.h>
#include <string.h>
int n, i, j, k;
int l[2000001];
char s[1000001];
int sol;
inline int Min(int i, int j) { return i < j ? i : j; }
int main()
{
freopen("pscpld.in", "r", stdin);
freopen("pscpld.out", "w", stdout);
n = 0;
scanf("%s", &s);
n = strlen(s);
for ( i = 1; i <= 2*n; i++ )
if ( i % 2 == 1 )
{
j = l[i];
k = (i+1)/2;
while ( k-j >= 1 && k+j <= n && s[k-j-1] == s[k+j-1] )
j++;
l[i] = j;
for ( j = 1; j < 2*l[i]-1; j++ )
if ( (i+j)%2 == 1 ) l[i+j] = Min(l[i-j], l[i]-j/2);
else l[i+j] = Min(l[i-j], l[i]-(j+1)/2);
}
else
{
j = l[i];
k = i/2;
while ( k-j >= 1 && k+j+1 <= n && s[k-j-1] == s[k+j+1-1] ) j++;
l[i] = j;
for ( j = 1; j < 2*l[i]; j++ )
if ( (i+j) % 2 == 1 ) l[i+j] = Min(l[i-j], l[i]-j/2);
else l[i+j] = Min(l[i-j], l[i]-j/2);
}
for ( i = 1; i <= 2*n; i++ )
sol += l[i];
printf("%d\n", sol);
return 0;
}