Pagini recente » Statistici Valentin Oprea (valinoscope46) | Cod sursa (job #174955) | Cod sursa (job #486089) | Cod sursa (job #91749) | Cod sursa (job #582389)
Cod sursa(job #582389)
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define MAX_N 2000010
int n, last;
long long sol;
int d[MAX_N];
char s[MAX_N / 2], A[MAX_N];
int main() {
freopen("pscpld.in", "r", stdin);
freopen("pscpld.out", "w", stdout);
scanf("%s", s);
int L = strlen(s);
for (int i = 0; i < L; i++) {
A[++n] = s[i];
if (i != L - 1)
A[++n] = '@';
}
for (int i = 1; i <= n; i++) {
if (i == 1) {
d[i] = 1;
last = 1;
}
else
d[i] = max(min(d[last - (i - last)] - 1, last + d[last] - i), 1);
int left = i - d[i], right = i + d[i];
while (0 < left && right <= n && A[left] == A[right]) {
d[i]++;
left--;
right++;
}
if (A[i] == '@')
sol += d[i] / 2;
else
sol += (d[i] + 1) / 2;
if (i + d[i] > last + d[last])
last = i;
}
printf("%lld\n", sol);
return 0;
}