Pagini recente » Cod sursa (job #2672987) | Cod sursa (job #3281914) | Cod sursa (job #1808010) | Cod sursa (job #784238) | Cod sursa (job #2470132)
#include <cstdio>
#include <cstring>
#include <algorithm>
const int MAX_N = 1000000;
char s1[5 + 2 * MAX_N];
char s[5 + 2 * MAX_N];
int LPS[5 + 2 * MAX_N];
int main() {
freopen("pscpld.in", "r", stdin);
freopen("pscpld.out", "w", stdout);
scanf("%s", s1);
int n = strlen(s1);
int k = 0;
for (int i = 0; i < n; i++) {
s[++k] = s1[i];
s[++k] = '|';
}
s[0] = '.';
s[k] = ';';
int N = k - 1;
int st, dr;
st = dr = 0;
for (int i = 1; i <= N; ++i) {
if (i > dr) {
LPS[i] = 1;
} else {
LPS[i] = std::min(dr - i + 1, LPS[dr + st - i]);
}
while (s[i - LPS[i]] == s[i + LPS[i]]) {
++LPS[i];
}
if (i + LPS[i] - 1 > dr) {
st = i + 1 - LPS[i];
dr = i + LPS[i] - 1;
}
}
long long ans = 0;
for (int i = 1; i <= N; ++i) {
if (s[i] >= 'a' && s[i] <= 'z') {
ans += 1LL * ((LPS[i] + 1) / 2);
} else {
ans += 1LL * (LPS[i] / 2);
}
}
printf ("%lld\n", ans);
return 0;
}