Cod sursa(job #446471)

Utilizator voyagerSachelarie Bogdan voyager Data 25 aprilie 2010 23:07:40
Problema PScPld Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <cstring>
#include <cstdio>
#include <algorithm>
#define FIN "pscpld.in"
#define FOUT "pscpld.out"
#define NMAX 1000010

using namespace std;

char sz[NMAX];
long long lg[NMAX * 2], dim = 0;

int main()
{
	long long ret = 0;
	FILE *fin = freopen(FIN, "r", stdin), *fout = freopen(FOUT, "w", stdout);
	for (char c = getchar(); c >= 'a' && c <= 'z'; c = getchar()) sz[++dim] = c;
	for (int i = 1; i <= (dim << 1) - 1; i += 2) lg[i] = 1;
	for (int i = 1, l, r; i <= (dim << 1) - 1; ++i)
	{
		if (i & 1) l = ((i + 1) >> 1) - ((lg[i] + 1) >> 1) , r = ((i + 1) >> 1) + ((lg[i] + 1) >> 1);
		else l = (i - lg[i]) >> 1, r = ((i + lg[i]) >> 1) + 1;

		while (l > 0 && r <= dim)
			if (sz[l] == sz[r]) --l, ++r, lg[i] += 2;
			else break;

		++l; --r;
		for (int il = (l << 1) - 1, ir = (r << 1) - 1; il < ir; ++il, --ir)
			if (il & 1) lg[ir] = max(lg[ir], min(lg[il], (long long)min(i - il + 1, il - (l << 1))));
			else lg[ir] = max(lg[ir], min(lg[il], (long long)min(i - il + 1, il - (l << 1) + 2)));

		ret += (lg[i] + 1) >> 1;
	}

	printf("%lld\n", ret);

	return 0;
}