Pagini recente » Cod sursa (job #2901924) | Cod sursa (job #813120) | Cod sursa (job #211074) | Cod sursa (job #245543) | Cod sursa (job #1820480)
#include <stdio.h>
#include <ctype.h>
#define MAX_N 1000005
int N;
char s[2 * MAX_N];
int delta[2 * MAX_N];
int MIN(int X, int Y) {
return X < Y ? X : Y;
}
int main(void) {
int i, c = 0, r = 0;
FILE *f = fopen("pscpld.in", "r");
char curr;
s[0] = '#';
while (isalpha(curr = fgetc(f))) {
s[++N] = curr;
s[++N] = '#';
}
fclose(f);
long long ans = 0;
for (i = 1; i <= N; i++) {
// Daca se afla in cadrul palindromului [c - delta[c], c + delta[c]].
if (i < r) {
delta[i] = MIN(delta[2 * c - i], r - i);
}
// Cauta mai multe palindroame centrate in pozitia "i".
while (i - delta[i] - 1 >= 0 && i + delta[i] + 1 <= N && s[i - delta[i] - 1] == s[i + delta[i] + 1]) {
delta[i]++;
}
// Imbunatateste cu un nou palindrom.
if (i + delta[i] > r) {
r = i + delta[i];
c = i;
}
// Aduna la solutie.
ans += (delta[i] + ((i & 1) == 0)) >> 1;
}
freopen("pscpld.out", "w", stdout);
fprintf(stdout, "%lld\n", ans + N / 2);
fclose(stdout);
return 0;
}