Cod sursa(job #106981)

Utilizator dominoMircea Pasoi domino Data 19 noiembrie 2007 01:01:17
Problema Abc2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <stdio.h>
#include <queue>

using namespace std;

#define MAX_TEXT 10000005
#define MAX_WORD 50005
#define MAX_DFA 1000005
#define FIN "abc2.in"
#define FOUT "abc2.out"

int N, dfa[MAX_DFA][3], trie[MAX_DFA][3], up[MAX_DFA], Res;
char F[MAX_DFA], word[MAX_WORD], text[MAX_TEXT];
queue<int> Q;

void insert_word(void)
{
    int n = 1;

    for (char *c = word; *c && *c != '\n'; ++c)
    {
        if (!trie[n][*c-'a'])
            trie[n][*c-'a'] = ++N;
        n = trie[n][*c-'a'];
    }
    F[n] = 1;
}

int main(void)
{
    int i, t, n;
    char *c;

    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);

    fgets(text, sizeof(text), stdin);
    for (N = 1, i = 0; fgets(word, sizeof(word), stdin); ++i)
        insert_word();

    for (i = 0; i < 3; ++i)
    {
        dfa[1][i] = 1;
        if (!trie[1][i]) continue;
        Q.push(trie[1][i]);
        up[trie[1][i]] = 1;
    }
    for (; !Q.empty(); Q.pop())
    {
        n = Q.front();
        for (i = 0; i < 3; ++i)
            if (trie[up[n]][i] == n) break;
        t = dfa[up[n]][i];
        dfa[up[n]][i] = n;
        F[n] |= F[t];
        for (i = 0; i < 3; ++i)
        {
            dfa[n][i] = trie[t][i] ? trie[t][i] : dfa[t][i];
            if (!trie[n][i]) continue;
            Q.push(trie[n][i]);
            up[trie[n][i]] = n;
        }
    }

    for (n = 1, c = text; *c && *c != '\n'; ++c)
    {
        n = dfa[n][*c-'a'];
        Res += F[n];
    }
    printf("%d\n", Res);

    return 0;
}