Pagini recente » Cod sursa (job #1183533) | Cod sursa (job #3003385) | Cod sursa (job #1083187) | Cod sursa (job #954589) | Cod sursa (job #98800)
Cod sursa(job #98800)
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
#define LMAX 1000010
int N;
char s[LMAX];
int trie[3][LMAX];
int tata[LMAX];
unsigned char tatam[LMAX];
int niv[LMAX];
int term[LMAX];
vector <pair <int, int> > vec;
int aut[3][LMAX];
char ss[10000010];
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;
tata[ns] = cur;
tatam[ns] = s[j] - 'a';
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] = i;
i++;
}
sort(vec.begin(), vec.end());
vector <pair <int, int> > :: iterator it;
for (i = 'a'; i <= 'c'; ++i) aut[i - 'a'][1] = 1;
for (it = vec.begin(); it != vec.end(); ++it) {
cur = (*it).second;
ant = aut[tatam[cur]][tata[cur]];
if (term[ant]) term[cur] = term[ant];
//memcpy(aut[cur], aut[ant], sizeof(aut[cur]));
for (i = 'a'; i <= 'c'; ++i) aut[i - 'a'][cur] = aut[i - 'a'][ant];
if (niv[ant] == niv[tata[cur]])
{
// printf("da\n");
for (i = 'a'; i <= 'c'; ++i)
if (trie[i - 'a'][ant]) aut[i - 'a'][cur] = trie[i - 'a'][ant];
}
aut[tatam[cur]][tata[cur]] = 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;
}