Pagini recente » Cod sursa (job #2595830) | Cod sursa (job #3248688) | Cod sursa (job #1911233) | Cod sursa (job #369904) | Cod sursa (job #99)
Cod sursa(job #99)
#include <stdio.h>
const int MAXN = 1000005;
int N, l, r, i, j, k, R, L;
char x[MAXN];
int nr[MAXN * 2], last, lastL, lastR;
long long SOL;
int main()
{
freopen("pscpld.in", "rt", stdin);
freopen("pscpld.out", "wt", stdout);
fgets(x, MAXN, stdin);
for (i = 0; x[i] != '\n' && x[i]; i++);
N = i;
for (last = lastL = lastR = -1, i = j = 0; i < 2 * N - 1; i++)
{
if (lastR < i)
nr[i] = 0;
else
{
k = lastR - i + lastL;
if (nr[k] > k - lastL + 1)
nr[i] = k - lastL + 1;
else
nr[i] = nr[lastR - i + lastL];
}
if (i % 2 == 0)
{
l = j - nr[i] / 2 - 1;
r = j + nr[i] / 2 + 1;
}
else
{
if (x[j] != x[j + 1]) { nr[i] = 0; j++; continue; }
l = j - nr[i] / 2;
r = j + nr[i] / 2 + 1;
}
for (; l >= 0 && r < N && x[l] == x[r]; l--, r++);
l++; r--; L = 2 * l; R = 2 * r;
if (R > lastR)
last = i,
lastL = L,
lastR = R;
nr[i] = r - l + 1;
if (i % 2) j++;
}
for (i = 0; i < 2 * N - 1; i++)
SOL += ((long long)nr[i] + 1) >> 1;
printf("%lld\n", SOL);
return 0;
}