Pagini recente » Cod sursa (job #2759200) | Cod sursa (job #1585623) | Cod sursa (job #890595) | Cod sursa (job #603719) | Cod sursa (job #1309441)
#include <cstdio>
using namespace std;
const int N = 1000003;
char s [N], a [2 * N];
int dp [2 * N];
long long ans = 0;
int main () {
int i, u, last, l, st, dr;
freopen ("pscpld.in", "r", stdin);
freopen ("pscpld.out", "w", stdout);
gets (s);
u = 0;
a [++ u] = '*';
for (i = 0; s [i]; i ++) {
a [++ u] = s [i];
a [++ u] = '*';
}
dp [0] = 0;
last = 0;
l = 0;
for (i = 1; i <= u; i ++) {
if (i >= l) {
st = i; dr = i;
while (st >= 1 && dr <= u && a [st] == a [dr]) {
st --; dr ++;
}
st ++; dr --;
dp [i] = dr - st + 1;
l = dr;
last = i;
}
if (i < l) {
dp [i] = dp [last - (i - last)];
if (dp [i] / 2 + i >= l) {
dp [i] = 1 + (l - i) * 2;
dr = l + 1;
st = i - (dr - i);
while (st >= 1 && dr <= u && a [st] == a [dr]) {
st --; dr ++;
}
st ++;
dr --;
dp [i] = dr - st + 1;
l = dr;
last = i;
}
}
}
for (i = 1; i <= u; i ++) {
if (a [i] == '*')
ans = ans + 1ll * dp [i] / 4;
else
ans = ans + 1ll * dp [i] / 4 + 1;
}
printf ("%lld\n", ans);
return 0;
}