Pagini recente » Cod sursa (job #3261013) | Cod sursa (job #1408119) | Cod sursa (job #2122161) | Cod sursa (job #3256729) | Cod sursa (job #98228)
Cod sursa(job #98228)
#include <cstdio>
const int NMAX = 10 * (1 << 20);
const int LMAX = 1 << 20;
const int 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;
int *pq, *pi, *pj, *pdj;
NQ = 1;
Q[0] = 0;
for (qi = 0, pq = Q; qi < NQ; ++qi, ++pq) {
u = *pq;
for (i = 0, pi = T[u]; i < W; ++i, ++pi) {
v = *pi;
if (v == 0) continue;
Q[NQ++] = v;
t = dfa[u][i];
dfa[u][i] = v;
end[v] += end[t];
for (j = 0, pj = T[t], pdj = dfa[t]; j < W; ++j, ++pj, ++pdj) {
dfa[v][j] = *pj != 0 ? *pj : *pdj;
}
}
}
}
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;
}