Pagini recente » ONIS 2014, Runda 2 | Cod sursa (job #326729) | Cod sursa (job #1609899) | Cod sursa (job #1126418) | Cod sursa (job #98247)
Cod sursa(job #98247)
#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;
}