Cod sursa(job #332824)

Utilizator ConsstantinTabacu Raul Consstantin Data 20 iulie 2009 11:57:53
Problema PScPld Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.9 kb
#include<stdio.h>
#include<fstream>
#include<string.h>
#define max(a,b) a>b?a:b
using namespace std;

int nr[2000010],N;
char text[1000010];
unsigned long long int sol;

void impar(int x){
int i,n,m;
for(i=x+nr[2*x-1];(i<=N)&&(i<=2*x-1);i++)
	if(text[i]==text[x-(i-x)]){
		nr[2*x-1]++;
		n=x+(i-x)/2+1;
		m=x-(i-x)/2-1;
		nr[2*n-1]=max(nr[2*n-1],nr[2*m-1]);}
	else
		return;
}


void par(int x){
int i,n,m;
for(i=x+nr[2*x];i<=N&&i+1<(2*x);i++)
	if(text[i]==text[x-(i-x+1)])
	{nr[2*x]++;
	n=x+(i-x+1)/2+1;
	m=x-(n-x+1);
	nr[2*n-1]=max(nr[2*m-1],nr[2*n-1]);
	}
	else
		return;

}
int main(){
ifstream f("pscpld.in");
freopen ("pscpld.out","w",stdout);

int i;
f>>text+1;
N=strlen(text+1);
for(i=1;i<=N;i++)
	{nr[2*i-1]=max(1,nr[2*i-1]);
	if(text[i]==text[i-1])
		nr[2*i]=max(nr[2*i],1);
	impar(i);
	par(i);
	sol+=nr[2*i]+nr[2*i-1];
	}
	
printf("%lld",sol);



return 0;}