Pagini recente » Cod sursa (job #320728) | Cod sursa (job #99916) | Cod sursa (job #2945760) | Cod sursa (job #1590696) | Cod sursa (job #108180)
Cod sursa(job #108180)
#include <fstream>
using namespace std;
#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];
char end[LMAX];
void read(void) {
ifstream fin("abc2.in");
int i, p, u;
char buf[32];
fin.getline(S, NMAX);
while (fin.getline(buf, 32)) {
// 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");
}
fin.close();
}
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;
if (end[t]) end[v] = 1;
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'];
if (end[p]) ++rez;
// printf("%d %d\n", i, rez);
}
ofstream fout("abc2.out");
fout << rez << endl;
fout.close();;
}
int main(void) {
read();
buildDfa();
write();
return 0;
}