Pagini recente » Cod sursa (job #2998534) | Cod sursa (job #1571787) | Cod sursa (job #2112323) | Cod sursa (job #1122932) | Cod sursa (job #1982694)
#include <cstdio>
#include <cstring>
using namespace std;
const int MAX_N = 1000000;
char s[MAX_N + 5];
char q[2 * MAX_N + 5];
int m[2 * MAX_N + 5];
int main() {
freopen("pscpld.in", "r", stdin);
freopen("pscpld.out", "w", stdout);
gets(s + 1);
int mid = 1, R = 1, n = strlen(s + 1);
for (int i = 1; i <= n; ++i)
q[2 * i - 1] = s[i];
for (int i = 1; i <= 2 * n; ++i) {
int sim = mid - (i - mid);
int dif = m[sim];
if (i > R) {
int l = i;
int r = i;
while (l > 0 && r <= 2 * n && q[l] == q[r]) {
m[i]++;
l--;
r++;
}
l++;
r--;
R = r;
mid = i;
} else if (i + dif >= R) {
int l = i - (R - i);
int r = R;
m[i] = R - i;
while (l > 0 && r <= 2 * n && q[l] == q[r]) {
m[i]++;
l--;
r++;
}
l++;
r--;
R = r;
mid = i;
} else {
m[i] = dif;
}
}
long long ans = 0;
for (int i = 1; i <= 2 * n; ++i) {
if (q[i] == 0) {
ans = ans + m[i] / 2;
}else {
ans = ans + (m[i] - 1) / 2 + 1;
}
}
printf("%lld\n", ans);
return 0;
}