Cod sursa(job #582389)

Utilizator savimSerban Andrei Stan savim Data 15 aprilie 2011 12:14:18
Problema PScPld Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.84 kb
#include <stdio.h>
#include <string.h>
#include <algorithm>

using namespace std;

#define MAX_N 2000010

int n, last;

long long  sol;

int d[MAX_N];

char s[MAX_N / 2], A[MAX_N];

int main() {

	freopen("pscpld.in", "r", stdin);
	freopen("pscpld.out", "w", stdout);

	scanf("%s", s);

	int L = strlen(s);
	for (int i = 0; i < L; i++) {
    	A[++n] = s[i];
		if (i != L - 1)
			A[++n] = '@';
	}	

	for (int i = 1; i <= n; i++) {
		if (i == 1) {
			d[i] = 1;
        	last = 1;
		}
		else 
			d[i] = max(min(d[last - (i - last)] - 1, last + d[last] - i), 1);

		int left = i - d[i], right = i + d[i];
		while (0 < left && right <= n && A[left] == A[right]) {
        	d[i]++;
			left--;
			right++;
		}

		if (A[i] == '@')
			sol += d[i] / 2;
		else
			sol += (d[i] + 1) / 2;

		if (i + d[i] > last + d[last])
			last = i;
	}

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

	return 0;
}