Cod sursa(job #960991)

Utilizator Kira96Denis Mita Kira96 Data 11 iunie 2013 14:48:52
Problema PScPld Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
/*
Problema de a afla nr de palindroame/cel mai mare palindrom in O(N)

Retinem palindromul cel mai din dreapta;Daca pozitia curenta i face parte
din acel palindrom,atunci ducem simetricul fata de centru si:daca lungimea maxima
a simetricului nu depaseste palindromul maximal atunci e clar ca vor fi egale ca distanta
daca da,atunci stim ca si i e palindrom pana la pozitia dr(unde se termina palindromul 
maximal).Deci il extindem cat de mult putem,si pozitia din dreapta o actualizam si astfel
i devine noul palindrom cel mai din dreapta.
*/
#include<fstream>
#include<cstring>
#define NM 1000010
#define M 2000100
using namespace std;
ifstream f("pscpld.in");
ofstream g("pscpld.out");
char s[NM],v[M];
long long i,n,t,st,dr,S,ii,p,d[M];
int main()
{
	f>>(s+1);
	n=strlen(s+1);
	v[0]='!';
	for(i=1;i<=n;i++)
	{
		v[++t]=s[i];
		v[++t]=' ';
	}
	v[t]='#';
	for(i=1;i<t;++i)
	{
		if(i<dr)
		{
			ii=p-(i-p);
			if(d[ii]+i-1<dr)
			d[i]=d[ii];
			else
			{
				d[i]=dr-i+1;
				st=i-d[i]+1;
				st--;dr++;
				while(v[st]==v[dr])
					{ d[i]++; st--; dr++; }
				dr--;
				p=i;
			}
		}
		else
		{
			st=dr=i;
			while(v[st]==v[dr])
				{ d[i]++; st--; dr++; }
			dr--;
			p=i;
		}
	}
	for(i=1;i<t;i+=2)
		S+=(d[i]+1)/2;
	for(i=2;i<t;i+=2)
		S+=d[i]/2;
	g<<S;
	return 0;
}