Pagini recente » Cod sursa (job #1511936) | Cod sursa (job #1227533)
#include <fstream>
#include <cstring>
#define MAXN 1000010
using namespace std;
ofstream out ("pscpld.out");
char S[MAXN];
int X[2 * MAXN];
int Best[MAXN * 2];
int main()
{
ifstream in ("pscpld.in");
int N, i, st, dr, right = -1, r, center = -1;
long long Ans = 0;
in >> (S + 1);
N = strlen (S + 1);
for (i = 1; i <= N; i ++)
X[2 * i] = S[i] - 'a' + 1;
N = 2 * N + 1;
X[0] = -1;
X[N + 1] = -2;
for (i = 1; i <= N; i ++){
st = dr = i;
if (i > right)
Best[i] = 0;
else{
r = i - center;
Best[i] = Best[center - r];
if (Best[i] > right - i)
Best[i] = right - i;
st -= Best[i];
dr += Best[i];
}
while (X[st - 1] == X[dr + 1])
Best[i] ++, st --, dr ++;
if (dr > right)
right = dr, center = i;
Ans += (Best[i] + 1) / 2;
}
out << Ans;
return 0;
}