Cod sursa(job #98247)

Utilizator ProstuStefan-Alexandru Filip Prostu Data 10 noiembrie 2007 11:35:04
Problema Abc2 Scor 0
Compilator c Status done
Runda Happy Coding 2007 Marime 1.27 kb
#include <stdio.h>

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

char S[NMAX];
int NT, T[LMAX][W], dfa[LMAX][W];
int NQ, Q[LMAX * W];
int end[LMAX];

void read(void) {
	FILE *fin = fopen("abc2.in", "rt");
	int i, p, u;
	char buf[32];

	fgets(S, NMAX, fin);

	while (fgets(buf, 32, fin) > 0) {
//		printf("%s\n", buf);
		
		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];
//			printf("c=%c p=%d\n", buf[i], p);
		}

		end[p] = 1;
//		printf("\n");
	}

	fclose(fin);
}

void buildDfa(void) {
	int qi, i, j, u, v, t;

	NQ = 1;
	Q[0] = 0;

	for (qi = 0; qi < NQ; ++qi) {
		u = Q[qi];

		for (i = 0; i < W; ++i) {
			v = T[u][i];

			if (v == 0) continue;

			Q[NQ++] = v;
			t = dfa[u][i];
			dfa[u][i] = v;
			end[v] += end[t];

			for (j = 0; j < W; ++j) {
				if (T[t][j] != 0)
					dfa[v][j] = T[t][j];
				else
					dfa[v][j] = dfa[t][j];
			}
		}
	}
}

void write(void) {
	int i, p, rez = 0;

	p = 0;
	for (i = 0; 'a' <= S[i] && S[i] <= 'c'; ++i) {
		p = dfa[p][S[i] - 'a'];
		rez += end[p];
//		printf("%d %d\n", i, rez);
	}

	FILE *fout = fopen("abc2.out", "wt");

	fprintf(fout, "%d\n", rez);

	fclose(fout);
}

int main(void) {

	read();

	buildDfa();

//	write();

	return 0;
}