Pagini recente » Cod sursa (job #1993471) | Cod sursa (job #1101520) | Cod sursa (job #1022544) | Cod sursa (job #3190079) | Cod sursa (job #1526)
Cod sursa(job #1526)
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define MAX_N 1000005
#define FIN "pscpld.in"
#define FOUT "pscpld.out"
#define FOR(i, a, b) for (i = (a); i < (b); i++)
int N, R[MAX_N<<1]; long long Res;
char S[MAX_N], S2[MAX_N<<1];
int main(void)
{
int i, j, k;
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
fgets(S, MAX_N, stdin);
N = strlen(S)-1;
FOR (i, 0, N) S2[i<<1] = S2[(i<<1)|1] = S[i];
N <<= 1;
for (i = j = 0; i < N; i += k)
{
for (; i-j >= 0 && i+j+1 < N && S2[i-j] == S2[i+j+1]; j++);
R[i] = j;
for (k = 1; k <= j && i >= k && R[i-k] != R[i]-k; k++)
{
R[i+k] = min(R[i-k], R[i]-k);
Res += (R[i+k]+1)>>1;
}
j = max(0, R[i]-k);
Res += (R[i]+1)>>1;
}
printf("%lld\n", Res);
return 0;
}