Pagini recente » Cod sursa (job #1113749) | Cod sursa (job #822973) | Cod sursa (job #692775) | Cod sursa (job #1972336) | Cod sursa (job #98814)
Cod sursa(job #98814)
#include <stdio.h>
#include <bitset>
#include <vector>
#include <algorithm>
using namespace std;
#define LMAX 1000010
int N;
char s[LMAX];
int trie[3][LMAX];
int niv[LMAX];
bitset <LMAX> term;
int aut[3][LMAX];
char ss[10000010];
int coada[LMAX];
int main()
{
int i, j, cur, ant;
freopen("abc2.in", "r", stdin);
freopen("abc2.out", "w", stdout);
fgets(ss, 10000010, stdin);
// ----------- automat ------------- //
int ns = 1;
niv[1] = 0;
i = 1;
while (fgets(s, LMAX, stdin)) {
cur = 1;
for (j = 0; 'a' <= s[j] && s[j] <= 'c'; j++)
if (!trie[s[j] - 'a'][cur]) {
ns++;
trie[s[j] - 'a'][cur] = ns;
niv[ns] = niv[cur] + 1;
// vec.push_back(make_pair(niv[ns], ns));
cur = ns;
} else {
cur = trie[s[j] - 'a'][cur];
}
// printf("%d\n", ns);
term[cur] = 1;
i++;
}
for (i = 'a'; i <= 'c'; ++i) aut[i - 'a'][1] = 1;
int p, q;
coada[0] = 1;
p = q = 0;
int x;
while (p <= q) {
x = coada[p];
p++;
for (j = 'a'; j <= 'c'; j++) {
if (!trie[j - 'a'][x]) continue;
cur = trie[j - 'a'][x];
coada[++q] = cur;
ant = aut[j - 'a'][x];
if (term[ant] == 1) term[cur] = 1;
for (i = 'a'; i <= 'c'; ++i) aut[i - 'a'][cur] = aut[i - 'a'][ant];
if (niv[ant] == niv[x])
for (i = 'a'; i <= 'c'; ++i)
if (trie[i - 'a'][ant]) aut[i - 'a'][cur] = trie[i - 'a'][ant];
aut[j - 'a'][x] = cur;
}
}
cur = 1;
int rez = 0;
for (i = 0; 'a' <= ss[i] && ss[i] <= 'c'; i++) {
cur = aut[ss[i] - 'a'][cur];
rez += term[cur] > 0;
}
printf("%d\n", rez);
fclose(stdin);
fclose(stdout);
return 0;
}