Cod sursa(job #1239485)

Utilizator Kira96Denis Mita Kira96 Data 9 octombrie 2014 08:20:48
Problema A+B Scor 0
Compilator cpp Status done
Runda Lista lui wefgef Marime 3.28 kb
#include<fstream>
#define FOR(a,b,c) for(register int a=b;a<=c;++a)
#define N 1000100
using namespace std;
ifstream f("unicat.in");
ofstream g("unicat.out");
char s[N],S[N];
int n,sol,st,dr,p,q,t;
struct Tr
{
	Tr *fiu[28],*tata;
	int k,L;
	Tr()
	{
		memset(fiu,0,sizeof(fiu));
		tata=NULL;
		k=L=0;
	}
};
#define T Tr*
T R=new Tr;
T kkt[N];
void dfs1(T t)
{
	if(t->L&1)
		sol+=(t->k==2);
	FOR(i,0,'z'-'a'+1)
	if(t->fiu[i])
		dfs1(t->fiu[i]);
}
void dfs2(T t)
{
	if(!(t->L&1))
		sol+=(t->k==2);
	FOR(i,0,'z'-'a'+1)
	if(t->fiu[i])
		dfs2(t->fiu[i]);
}
int main ()
{
	f>>(s+1);
	n=strlen(s+1);
	FOR(i,1,2*n-1)
	{
		if(i&1)
			S[++t]=s[(i+1)/2]-'a';
		else
			S[++t]='z'-'a'+1;
	}
	n=2*n-1;
	S[++n]='#';
	R->fiu[S[1]]=new Tr;
	R->fiu[S[1]]->tata=R;
	p=1;
	q=1;
	kkt[1]=R->fiu[S[1]];
	kkt[1]->L=1;
	FOR(i,2,n)
	{
		if(i>=q)
		{
			kkt[i]=R;
			st=dr=i;
			while(S[st]==S[dr])
			{
				if(!kkt[i]->fiu[S[st]])
				{
					kkt[i]->fiu[S[st]]=new Tr;
					kkt[i]->fiu[S[st]]->tata=kkt[i];
					kkt[i]->fiu[S[st]]->L=kkt[i]->L+1;
					kkt[i]->fiu[S[st]]->k=1;
				}
				kkt[i]=kkt[i]->fiu[S[st]];
				st--;
				dr++;
			}
			p=i;
			q=dr-1;
		}
		else
		{
			int sim=i-(i-p);
			int len=kkt[sim]->L;
			if(i+len-1<q)
				kkt[i]=kkt[sim];
			else
			{
				int dif=i+len-1-q;
				kkt[i]=kkt[sim];
				while(dif)
				{
					kkt[i]=kkt[i]->tata;
					dif--;
				}
				dr=q;
				st=i-(q-i);
				dr++;
				st--;
				while(S[st]==S[dr])
				{
					if(!kkt[i]->fiu[S[st]])
					{
						kkt[i]->fiu[S[st]]=new Tr;
						kkt[i]->fiu[S[st]]->tata=kkt[i];
						kkt[i]->fiu[S[st]]->L=kkt[i]->L+1;
						kkt[i]->fiu[S[st]]->k=1;
					}
					kkt[i]=kkt[i]->fiu[S[st]];
					st--;
					dr++;
				}
				q=dr-1;
				p=i;
			}
		}
	}
	f>>(s+1);
	n=strlen(s+1);
	t=0;
	FOR(i,1,2*n-1)
	{
		if(i&1)
			S[++t]=s[(i+1)/2]-'a';
		else
			S[++t]='z'-'a'+1;
	}
	n=2*n-1;
	S[++n]='#';
	if(!R->fiu[S[1]])
	{
		R->fiu[S[1]]=new Tr;
		R->fiu[S[1]]->tata=R;
		if(R->fiu[S[1]]->k)
			R->fiu[S[1]]->k=2;
	}
	if(R->fiu[S[1]]->k==1)
			R->fiu[S[1]]->k=2;
	p=1;
	q=1;
	kkt[1]=R->fiu[S[1]];
	kkt[1]->L=1;
	FOR(i,2,n)
	{
		if(i>=q)
		{
			kkt[i]=R;
			st=dr=i;
			while(S[st]==S[dr])
			{
				if(!kkt[i]->fiu[S[st]])
				{
					kkt[i]->fiu[S[st]]=new Tr;
					kkt[i]->fiu[S[st]]->tata=kkt[i];
					kkt[i]->fiu[S[st]]->L=kkt[i]->L+1;
				}
				kkt[i]=kkt[i]->fiu[S[st]];
				if(kkt[i]->k==1)
					kkt[i]->k=2;
				st--;
				dr++;
			}
			p=i;
			q=dr-1;
		}
		else
		{
			int sim=i-(i-p);
			int len=kkt[sim]->L;
			if(i+len-1<q)
				kkt[i]=kkt[sim];
			else
			{
				int dif=i+len-1-q;
				kkt[i]=kkt[sim];
				while(dif)
				{
					kkt[i]=kkt[i]->tata;
					dif--;
				}
				dr=q;
				st=i-(q-i);
				dr++;
				st--;
				while(S[st]==S[dr])
				{
					if(!kkt[i]->fiu[S[st]])
					{
						kkt[i]->fiu[S[st]]=new Tr;
						kkt[i]->fiu[S[st]]->tata=kkt[i];
						kkt[i]->fiu[S[st]]->L=kkt[i]->L+1;
						kkt[i]->fiu[S[st]]->k=1;
					}
					kkt[i]=kkt[i]->fiu[S[st]];
					if(kkt[i]->k==1)
						kkt[i]->k=2;
					st--;
					dr++;
				}
				q=dr-1;
				p=i;
			}
		}
	}
	FOR(i,0,'z'-'a')
	if(R->fiu[i])
		dfs1(R->fiu[i]);
	if(R->fiu['z'-'a'+1])
		dfs2(R->fiu['z'-'a'+1]);
	g<<sol;
	return 0;
}