Pagini recente » Cod sursa (job #1183015) | Cod sursa (job #625030) | Cod sursa (job #1727141) | Cod sursa (job #1129022) | Cod sursa (job #240957)
Cod sursa(job #240957)
#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;
}