Cod sursa(job #114326)

Utilizator tm_raduToma Radu tm_radu Data 13 decembrie 2007 19:54:16
Problema PScPld Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <stdio.h>
#include <string.h>

int n, i, j, k;
int l[2000001];
char s[1000001];
int sol;
inline int Min(int i, int j) { return i < j ? i : j; }

int main()
{
	freopen("pscpld.in", "r", stdin);
	freopen("pscpld.out", "w", stdout);
	n = 0;
	scanf("%s", &s);
	n = strlen(s);
	for ( i = 1; i <= 2*n; i++ )
		if ( i % 2 == 1 )
		{
			j = l[i];
			k = (i+1)/2;
			while ( k-j >= 1 && k+j <= n && s[k-j-1] == s[k+j-1] )
				j++;
			l[i] = j;
			for ( j = 1; j < 2*l[i]-1; j++ )
				if ( (i+j)%2 == 1 ) l[i+j] = Min(l[i-j], l[i]-j/2);
				else                l[i+j] = Min(l[i-j], l[i]-(j+1)/2);
		}
		else
		{
			j = l[i];
			k = i/2;
			while ( k-j >= 1 && k+j+1 <= n && s[k-j-1] == s[k+j+1-1] ) j++;
			l[i] = j;
			for ( j = 1; j < 2*l[i]; j++ )
				if ( (i+j) % 2 == 1 ) l[i+j] = Min(l[i-j], l[i]-j/2);
				else                  l[i+j] = Min(l[i-j], l[i]-j/2);
		}
	for ( i = 1; i <= 2*n; i++ )
	    sol += l[i];
    printf("%d\n", sol);
    
    return 0;
}