Pagini recente » Cod sursa (job #2312438) | Cod sursa (job #2685538) | Cod sursa (job #2869155) | Cod sursa (job #2072223) | Cod sursa (job #1239485)
#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;
}