Cod sursa(job #107081)

Utilizator alextheroTandrau Alexandru alexthero Data 19 noiembrie 2007 10:30:09
Problema Abc2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#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;
}