Pagini recente » Cod sursa (job #2485396) | Cod sursa (job #1028336) | Cod sursa (job #2844989) | Cod sursa (job #2564486) | Cod sursa (job #2295949)
#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;
}