Pagini recente » Cod sursa (job #459643) | Cod sursa (job #3292332) | Cod sursa (job #3288639) | Cod sursa (job #2923176) | Cod sursa (job #3294658)
#include <stdio.h>
#include <ctype.h>
#define MAXN 1000000
char v[2 * MAXN + 1];
int p[2 * MAXN + 1];
int minim(int a, int b) {
return a < b ? a : b;
}
int main()
{
FILE *fin, *fout;
//manacher
int n, i, dr, mij, st;
long long rez;
char ch;
n = 1;
v[0] = '#';
fin = fopen("pscpld.in", "r");
ch = fgetc(fin);
while (isalpha(ch)) {
v[n] = ch;
v[n + 1] = '#';
n += 2;
ch = fgetc(fin);
}
fclose(fin);
dr = mij = -1;
rez = 0;
for (i = 0; i < n; i++) {
st = 2 * mij - i;
if (st >= 0) {
p[i] = minim(dr - i, p[st]);
}
while (i - p[i] - 1 >= 0 && i + p[i] + 1 < n && v[i - p[i] - 1] == v[i + p[i] + 1]) {
p[i]++;
}
if (i % 2 > 0) {
rez += p[i] / 2 + 1;//daca e litera
} else {
rez += p[i] / 2;//daca e #
}
if (i + p[i] > dr) {
dr = i + p[i];
mij = i;
}
}
fout = fopen("pscpld.out", "w");
fprintf(fout, "%lld\n", rez);
fclose(fout);
return 0;
}