Pagini recente » Cod sursa (job #31569) | Cod sursa (job #1265636) | Cod sursa (job #2480718) | Cod sursa (job #1826949) | Cod sursa (job #107375)
Cod sursa(job #107375)
#include <stdio.h>
#define NMAX 1000002
long int ATM[NMAX][3],TR[NMAX][3];
long int i,j,k,n,m,nst,dr,len,st,sol;
char s[NMAX*10],cv[NMAX],AC[NMAX];
long int cd[NMAX][3];
void baga_trie(long int nod, long int poz)
{
if (poz>len) {AC[nod]=1;return;}
if (!TR[nod][ cv[poz] ]) TR[nod][ cv[poz] ]=++nst;
baga_trie(TR[nod][ cv[poz] ],poz+1);
}
void baga_atm(long int nod, long int tata,long int x)
{
long int bunic,j;
bunic=ATM[tata][x];
ATM[tata][x]=nod;
if (AC[bunic]) AC[nod]=1;
for (j=0;j<=2;j++)
if (TR[bunic][j]) ATM[nod][j]=TR[bunic][j];
else ATM[nod][j]=ATM[bunic][j];
}
int main()
{
freopen("abc2.in","r",stdin);
freopen("abc2.out","w",stdout);
fgets(s,NMAX*10,stdin);
while (fgets(cv,NMAX,stdin))
{
if (cv[0]=='\n') break;
for (i=0;(cv[i]>='a')&&(cv[i]<='c');i++)
cv[i]-='a';
len=i-1;
baga_trie(0,0);
}
dr=0;
for (i=0;i<=2;i++)
if (TR[0][i])
{
cd[++dr][0]=TR[0][i];
cd[dr][1]=0;
cd[dr][2]=i;
}
for (i=1;i<=dr;i++)
{
baga_atm(cd[i][0],cd[i][1],cd[i][2]);
for (j=0;j<=2;j++)
if (TR[ cd[i][0] ][j]) {
cd[++dr][0]=TR[cd[i][0]][j];
cd[dr][1]=cd[i][0];
cd[dr][2]=j;
}
}
st=0;
for (i=0;(s[i]>='a')&&(s[i]<='c');i++)
{
s[i]-='a';
st=ATM[st][s[i]];
if (AC[st]) sol++;
}
printf("%ld",sol);
return 0;
}