Cod sursa(job #940394)

Utilizator rudarelLup Ionut rudarel Data 16 aprilie 2013 09:04:00
Problema Abc2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#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];
char 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;
            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);
    }
 
    FILE *fout = fopen("abc2.out", "wt");
 
    fprintf(fout, "%d\n", rez);
 
    fclose(fout);
}
 
int main(void) {
 
    read();
 
    buildDfa();
 
    write();
 
    return 0;
}