Pagini recente » Cod sursa (job #88971) | Cod sursa (job #152589) | Cod sursa (job #18098) | Cod sursa (job #2507079) | Cod sursa (job #102595)
Cod sursa(job #102595)
#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;
}