Cod sursa(job #1063065)

Utilizator octav1234Pocola Tudor Octavian octav1234 Data 21 decembrie 2013 11:00:15
Problema PScPld Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.7 kb
#include <fstream>
#include <cstring>
#include <iostream>
using namespace std;
ifstream fi("pscpld.in");
ofstream fo("pscpld.out");
char C[2000020],A[1000005];
int i,k;
int n;
int P[2000020],id=1,mx=2;
long long rez;
int main()
{
	C[0]='$';
	C[1]='#';
	i=1;
	fi>>A;
	n=strlen(A);
	k=2;
	for(i=0;i<n;i++)
	{
		C[k++]=A[i];
		C[k++]='#';
	}
	C[k]='\0';
	P[1]=1;
	n=strlen(C);
	for(i=2;i<n;i++)
	{
		P[i]=mx>i ? min(P[2*id-i],mx-i):1;
		while(C[i+P[i]]==C[i-P[i]])
			P[i]++;
		if(P[i]+i>mx)
		{
			mx=P[i]+i;
			id=i;
		}
	}
	for(i=1;i<n;i++)
	{
		if(C[i]=='#')
		{
			rez+=(P[i]-1)/2;
		}
		else
			rez+=P[i]/2;
	}
	fo<<rez<<'\n';
	fi.close();
	fo.close();
	return 0;
}