Cod sursa(job #2295949)

Utilizator miruna1224Floroiu Miruna miruna1224 Data 4 decembrie 2018 01:26:45
Problema Abc2 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.22 kb

#include <stdio.h>

const int N = (1 << 20);

char S[N*10];
int nr, K[N][3], dfa[N][3];
int M, m[N * 3];
char cuv[N];

void citeste() {

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

	fgets(S, N*10, in);

	while (fgets(buf, 32, in) > 0) {

		p = 0;
		for (i = 0; 'a' <= buf[i] && buf[i] <= 'c'; ++i) {
			u = buf[i] - 'a';
			if (K[p][u] == 0)
				K[p][u] = ++nr;
			p = K[p][u];
		}

		cuv[p] = 1;
	}

	fclose(in);
}

void DFA() {

	int k, i, j, u, v, aux;

	M = 1;
	m[0] = 0;

	for (k = 0; k < M; ++k) {
		u = m[k];

		for (i = 0; i < 3; ++i) {
			v = K[u][i];
			if (v == 0)
                continue;
			m[M++] = v;
			aux = dfa[u][i];
			dfa[u][i] = v;
			if (cuv[aux])
                cuv[v] = 1;

			for (j = 0; j < 3; ++j) {
				if (K[aux][j] != 0)
					dfa[v][j] = K[aux][j];
				else
					dfa[v][j] = dfa[aux][j];
			}
		}
	}
}

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

	p = 0;
	for (i = 0; 'a' <= S[i] && S[i] <= 'c'; ++i) {
		p = dfa[p][S[i] - 'a'];
		if (cuv[p])
            ++rez;
	}

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

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

	fclose(out);
}

int main() {

	citeste();

	DFA();

	scrie();

	return 0;
}