Cod sursa(job #645003)

Utilizator Cristy94Buleandra Cristian Cristy94 Data 7 decembrie 2011 22:53:51
Problema PScPld Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include<cstdio>
#include<cstring>
#include<algorithm>
#define Nmax 1000002

using namespace std;


char v[Nmax];

int l[2*Nmax],s[2*Nmax],st,dr;

long long sol;

int main(){
	
	freopen("pscpld.in","r",stdin);
	freopen("pscpld.out","w",stdout);
	
	fgets(v,Nmax,stdin);
	
	if(v[strlen(v)-1]=='\n')
		v[strlen(v)-1]='\0';
	
	int N=strlen(v)-1;
	
	for(int i=0;i<=2*N;++i){
		
		//vedem daca e cuprins in palindroamele gasite deja
		while(st<=dr && s[st]+l[s[st]] < i)
			st++;
		
		//daca este cuprins in palindrom, luam valoare
		if(st<=dr)
			l[i]=l[s[st]-(i-s[st])];
		
		int d=(l[i]/2);
		bool ok=0;
		
		while( i+d+1<2*(N+1) && d < i-l[i] && i/2+d+1<=N && i/2-d-1 + i%2>=0 && v[i/2+d+1]==v[i/2-d-1 + i%2] ){
			++d;
			ok=1;
		}
		
		if(ok || l[i]==0)
			l[i]=2*d+(1-i%2);
		
		//stergem palindroamele anterioare daca nu sunt de lungime maxim
		while(i+l[i]/2 > s[dr]+l[s[dr]]/2 && dr>=st)
				--dr;
		
		//salvam palindromul curent
		if(i+l[i]/2 > s[dr]+l[s[dr]]/2 || dr<st	)
				s[++dr]=i;
	
		sol+=l[i]/2+1-i%2;
}
	printf("%lld",sol);
	
return 0;
}