Cod sursa(job #99)

Utilizator bogdan2412Bogdan-Cristian Tataroiu bogdan2412 Data 4 decembrie 2006 23:48:12
Problema PScPld Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <stdio.h>

const int MAXN = 1000005;

int N, l, r, i, j, k, R, L;
char x[MAXN];
int nr[MAXN * 2], last, lastL, lastR;
long long SOL;

int main()
{
	freopen("pscpld.in", "rt", stdin);
	freopen("pscpld.out", "wt", stdout);
	fgets(x, MAXN, stdin);
	for (i = 0; x[i] != '\n' && x[i]; i++);
	N = i;
	for (last = lastL = lastR = -1, i = j = 0; i < 2 * N - 1; i++)
	{
                if (lastR < i)
                        nr[i] = 0;
                else
                {
                        k = lastR - i + lastL;
                        if (nr[k] > k - lastL + 1)
                                nr[i] = k - lastL + 1;
                        else
                                nr[i] = nr[lastR - i + lastL];
                }
		if (i % 2 == 0)
		{	
			l = j - nr[i] / 2 - 1;
			r = j + nr[i] / 2 + 1;
		}
		else
		{
			if (x[j] != x[j + 1]) { nr[i] = 0; j++; continue; }
			l = j - nr[i] / 2;
			r = j + nr[i] / 2 + 1;
		}
		
		for (; l >= 0 && r < N && x[l] == x[r]; l--, r++);
		l++; r--; L = 2 * l; R = 2 * r;
                if (R > lastR)
                        last = i,
                        lastL = L,
                        lastR = R;
		nr[i] = r - l + 1;

		if (i % 2) j++;
	}

	for (i = 0; i < 2 * N - 1; i++)
		SOL += ((long long)nr[i] + 1) >> 1;
	printf("%lld\n", SOL);
	return 0;
}