Cod sursa(job #206680)
#include<stdio.h>
#include<string.h>
# define NM 10000007
# define MM 21
# define N 1000007
int n=1,len,kroot,ok,a,i,j,k,l;
int v[N][3];
int ab1[N][3];
int ab2[N];
int ab3[N];
unsigned char s[N];
char sM[NM];
char sm[MM];
void crissis(char *sm){
kroot=1;
for(char *c=sm;*c;++c){
i=*c-'a';
if(v[kroot][i])
kroot=v[kroot][i];
else{
v[kroot][i]=++n;
kroot=n;
}
}
s[n]=1;
}
void solve(char *sm){
kroot=1;
for(char *c=sm;*c;++c){
i=*c-'a';
kroot=ab1[kroot][i];
a+=s[kroot];
}
}
void funct(){
int sf=0,u,i;
for(i=0;i<3;++i){
ab1[1][i]=1;
if(v[1][i]!=1){
ab2[sf++]=v[1][i];
ab3[v[1][i]]=1;
ab1[1][i]=v[1][i];
}
}
for(i=0;i<sf;++i){
for(j=0;j<3;++j)
if(v[ab2[i]][j]){
ab2[sf++]=v[ab2[i]][j];
u=ab3[ab2[i]];
while(!v[u][j])
u=ab3[u];
ab3[v[ab2[i]][j]]=v[u][j];
if(s[ab3[v[ab2[i]][j]]]==1)
s[v[ab2[i]][j]]=1;
}
for(l=0;l<3;++l){
if(v[ab2[i]][l]!=0)
ab1[ab2[i]][l]=v[ab2[i]][l];
else
ab1[ab2[i]][l]=ab1[ab3[ab2[i]]][l];
if(!ab1[ab2[i]][l])
ab1[ab2[i]][l]=1;
}
}
}
int main(){
freopen("abc2.in","r",stdin);
freopen("abc2.out","w",stdout);
scanf("%s",sM);
for(l=0;scanf("%s",sm)!= EOF;)
crissis(sm);
for(i=0;i<3;++i)
if(!v[1][i])
v[1][i]=1;
funct();
solve(sM);
printf("%d",a);
fclose(stdin);
fclose(stdout);
return 0;
}