Cod sursa(job #240957)

Utilizator alex_mircescuAlex Mircescu alex_mircescu Data 8 ianuarie 2009 22:41:09
Problema Abc2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <stdio.h>
#include <math.h>

#define NMAX (10 * (1 << 20))
#define LMAX (1 << 20)

long j, t, v, qi, rez, i, p, u, NT, T[LMAX][3], dfa[LMAX][3], NQ, Q[LMAX];
char S[NMAX], end[LMAX], buf[32];

int main(void) {
	freopen("abc2.in", "r", stdin);
	freopen("abc2.out", "w", stdout);
	fgets(S, NMAX, stdin);
	while (fgets(buf, 32, stdin) > 0) {
		p = 0;
		for (i = 0; 'a' <= buf[i] && buf[i] <= 'c'; ++i) {
			u = buf[i] - 'a';
			if (T[p][u] == 0) {
				T[p][u] = ++NT;
			}
			p = T[p][u];
		}
		end[p] = 1;
	}
	NQ = 1;
	Q[0] = 0;
	for (qi = 0; qi < NQ; ++qi) {
		u = Q[qi];
		for (i = 0; i < 3; ++i) {
			v = T[u][i];
			if (v == 0) continue;
			Q[NQ++] = v;
			t = dfa[u][i];
			dfa[u][i] = v;
			if (end[t]) {
				end[v] = 1;
			}
			for (j = 0; j < 3; ++j) {
				if (T[t][j] != 0) {
					dfa[v][j] = T[t][j];
				} else {
					dfa[v][j] = dfa[t][j];
				}
			}
		}
	}
	p = 0;
	for (i = 0; 'a' <= S[i] && S[i] <= 'c'; ++i) {
		p = dfa[p][S[i] - 'a'];
		if (end[p]) {
			++rez;
		}
	}
	printf("%ld\n", rez);
	return 0;
}