Pagini recente » Cod sursa (job #3196099) | Cod sursa (job #453159) | Cod sursa (job #417376) | Cod sursa (job #722136) | Cod sursa (job #1449888)
#include <stdio.h>
#include <string.h>
#define MAXN 1000005
#define MIN(a, b) (((a) < (b))?(a):(b))
using namespace std;
long long sol;
int n, lg[2 * MAXN], mxr, c, l, r, x;
char s[MAXN];
int main() {
freopen("pscpld.in", "r", stdin);
freopen("pscpld.out", "w", stdout);
int i;
scanf("%s\n", s + 1);
n = strlen(s + 1);
for(i = 1; i < 2 * n; i++) {
if (mxr >= i) {
x = 2 * c - i;
lg[i] = MIN(lg[x], (mxr - i) / 2 + 1);
}
if(i % 2)
x = l = r = (i + 1) / 2;
else {
l = i / 2;
x = r = l + 1;
}
l -= lg[i]; r += lg[i];
while (l > 0 && r <= n && s[l--] == s[r++]) lg[i]++;
x += lg[i] - 1;
x = x * 2 - 1;
if(x > mxr) {
mxr = x;
c = i;
}
sol += lg[i];
}
printf("%lld\n", sol);
return 0;
}