Pagini recente » Cod sursa (job #1458665) | Cod sursa (job #3184162) | Cod sursa (job #2755360) | Cod sursa (job #1931926) | Cod sursa (job #582388)
Cod sursa(job #582388)
#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("%c %d %d %d\n", A[i], d[i], last, sol);
}
printf("%lld\n", sol);
return 0;
}