Pagini recente » Cod sursa (job #1810887) | Cod sursa (job #674059) | Cod sursa (job #2300197) | Rating Stefan (Stefan3002) | Cod sursa (job #107081)
Cod sursa(job #107081)
#include <stdio.h>
#include <string>
#define nmax 10000005
#define Nmax 1000005
using namespace std;
char s[nmax], S[25], accept[Nmax];
int tr[Nmax][3], atm[Nmax][3], noduriTrie = 0, st[Nmax][3], p, q;
void insertTrie(int nod, int p)
{
if(p > (int)strlen(S) - 1) accept[nod] = 1;
else
{
if(!tr[nod][S[p] - 'a']) tr[nod][S[p] - 'a'] = ++noduriTrie;
insertTrie(tr[nod][S[p] - 'a'], p + 1);
}
}
void insertAutomat(int j)
{
int nod = st[j][0], litera = st[j][1], tata = st[j][2];
//printf("%d ", nod);
int bunic = atm[tata][litera];
atm[tata][litera] = nod;
if(accept[bunic]) accept[nod] = 1;
for(int i = 0; i < 3; i++)
if(tr[bunic][i]) atm[nod][i] = tr[bunic][i];
else atm[nod][i] = atm[bunic][i];
}
void bfs()
{
q = 1; p = 0;
for(int i = 0; i < 3; i++)
if(tr[0][i])
{
st[++p][0] = tr[0][i];
st[p][1] = i;
st[p][2] = 0;
}
while(q <= p)
{
insertAutomat(q);
for(int i = 0; i < 3; i++)
if(tr[st[q][0]][i])
{
st[++p][0] = tr[st[q][0]][i];
st[p][1] = i;
st[p][2] = st[q][0];
}
q++;
}
}
int main()
{
freopen("abc2.in", "r", stdin);
freopen("abc2.out", "w", stdout);
scanf("%s\n", s);
while(!feof(stdin))
{
scanf("%s\n", S);
insertTrie(0, 0);
}
bfs();
int rez = 0, crt = 0;
for(int i = 0; i < (int)strlen(s); i++)
{
crt = atm[crt][s[i] - 'a'];
if(accept[crt]) rez++;
}
printf("%d\n", rez);
return 0;
}