Cod sursa(job #467747)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 30 iunie 2010 12:15:20
Problema PScPld Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <stdio.h>
#define NMAX 1000005
#define MOD 9901
#define LMAX 2000005
#define ll long long
char A[NMAX],B[LMAX];
int n,r,st,dr,left[LMAX],right[LMAX],nr[LMAX];
ll rez;
inline int lit(char x)
{
	return x>='a' && x<='z';
}
void read()
{
	fgets(A+1,NMAX,stdin);
	while (lit(A[n+1])) n++;
	int i;
	for (i=1; i<n; i++)
	{
		B[++r]=A[i];
		nr[r]=nr[r-1];
		B[++r]='a';
		nr[r]=nr[r-1]+1;
	}
	B[++r]=A[n];
	nr[r]=nr[r-1];
	n=r;
}
void solve()
{
	int i,a,b,c;
	for (i=1; i<=n; i++)
		if (i>dr)
		{
			a=b=i;
			while (B[a-1]==B[b+1] && a-1>=1 && b+1<=n)
				a--,b++;
			rez+=(i-a+1)-(nr[i]-nr[a-1]);
			st=a; dr=b;
			left[i]=st; right[i]=dr;
		}
		else
		{
			a=st+(dr-i);
			b=left[a]; c=right[a];
			if (b>st)
			{
				left[i]=i-(a-b);
				right[i]=i+(a-b);
				rez+=(i-left[i]+1)-(nr[i]-nr[left[i]-1]);
			}
			else
			{
				a=i-(dr-i); b=dr;
				while (B[a-1]==B[b+1] && a-1>=1 && b+1<=n)
					a--,b++;
				rez+=(i-a+1)-(nr[i]-nr[a-1]);
				st=a; dr=b;
				left[i]=a; right[i]=b;
			}
		}
}
int main()
{
	freopen("pscpld.in","r",stdin);
	freopen("pscpld.out","w",stdout);
	read();
	solve();
	printf("%lld\n",rez);
	return 0;
}