Cod sursa(job #98289)

Utilizator bogdan2412Bogdan-Cristian Tataroiu bogdan2412 Data 10 noiembrie 2007 12:10:42
Problema Abc2 Scor 0
Compilator cpp Status done
Runda Happy Coding 2007 Marime 1.58 kb
#include <stdio.h>
#include <string.h>

#define MAXL 10000005
#define MAXCuv 50005
#define MAXN (MAXCuv*12)
#define SIGMA 3

int N;
char s[MAXL];
char tmp[32];

int stareCur[MAXCuv];
char v[MAXCuv][21];

int Tr[MAXN][SIGMA], niv[MAXN], p[MAXN], term[MAXN], DFA[MAXN][SIGMA], NR;

int main()
{
	freopen("abc2.in", "rt", stdin);
	freopen("abc2.out", "wt", stdout);
	int i;
	fgets(s, MAXL, stdin);

	for (N = 0; fgets(v[N], 32, stdin); )
	{
		int k;
		for (k = 0; 'a' <= v[N][k] && v[N][k] <= 'z'; k++);
		v[N][k] = 0;

		if (k == 0)
			continue;

		N++;
	}

	//init
	NR = 0; p[0] = -1;
	memset(Tr, -1, sizeof(Tr));
	memset(term, 0, sizeof(term));

	//make trie & DFA
	int wlen = strlen( v[0] );
	for (i = 0; i < wlen; i++)
	{
		int j;
		for (j = 0; j < N; j++)
		{
			int C = v[j][i] - 'a';

			if (Tr[ stareCur[j] ][C] == -1)
			{
				Tr[ stareCur[j] ][C] = ++NR;
				niv[NR] = niv[ stareCur[j] ] + 1;
				p[NR] = stareCur[j];
				stareCur[j] = NR;
			}
			else
				stareCur[j] = Tr[ stareCur[j] ][C];
			if (i == wlen - 1)
				term[ stareCur[j] ] = 1;
		}

		for (int j = 0; j < N; j++)
		{
			int k, stare, parent, aux, C = v[j][i] - 'a';
			stare = stareCur[j];

			parent = p[stare];
			aux = DFA[ parent ][ C ];

			DFA[parent][ C ] = stare;
			memcpy( DFA[stare], DFA[aux], sizeof( DFA[stare] ) );
			if (niv[aux] == niv[parent])
				for (k = 0; k < SIGMA; k++)
					if (Tr[aux][k] != -1)
						DFA[stare][k] = Tr[aux][k];
		}
	}

	//get matchings
	int stare = 0, NR = 0;
	for (i = 0; s[i] != '\n'; i++)
	{
		stare = DFA[stare][ s[i] - 'a' ];
		if (term[stare])
			NR++;
	}

	printf("%d\n", NR);
	return 0;
}