Pagini recente » Cod sursa (job #87640) | Cod sursa (job #1954471) | Cod sursa (job #1785487) | Cod sursa (job #562343) | Cod sursa (job #107598)
Cod sursa(job #107598)
#include<stdio.h>
#include<vector>
#define vpi vector <int >
#define vpii vector <int > :: iterator
#define mkp make_pair
#define ss second
#define pb push_back
#include<algorithm>
const int maxl = 21;
const int maxalf = 3;
const int maxn = 600100;
const int lemax = 10000100;
using namespace std;
int aut[maxn][maxalf];
int trie[maxn][maxalf];
char a[lemax];
int i;
char s[maxl];
int k;
int j;
int tata[maxn];
char tatam[maxn];
int nst;
char niv[maxn];
vpi vect[maxl + 2];
int lung;
bool ver;
int m;
int main()
{
freopen("abc2.in","r",stdin);
freopen("abc2.out","w",stdout);
fgets(a,lemax,stdin);
int n = strlen(a) - 2;
int cur;
nst = 1;
vect[0].pb(1);
while(!feof(stdin))
{
++m;
fgets(s,30,stdin);
lung = strlen(s) - 2;
cur = 1;
for(i = 0;i <= lung;++i)
{
if (!trie[cur][s[i] - 'a'])
{
++nst;
trie[cur][s[i] - 'a'] = nst;
tata[nst] = cur;
tatam[nst] = s[i] - 'a';
niv[nst] = niv[cur] + 1;
vect[niv[nst]].pb(nst);
}
cur = trie[cur][s[i] - 'a'];
}
}
// sort(vect.begin(),vect.end());
for(i = 0;i <= 2; ++i)
{
aut[1][i] = 1;
}
for(i = 1;i <= lung + 1; ++i)
{
for(vpii it = vect[i].begin(); it != vect[i].end(); ++it)
{
int st = (*it);
int ant = aut[tata[st]][tatam[st]];
memcpy(aut[st],aut[ant],sizeof(aut[ant]));
if (niv[tata[st]] == niv[ant])
{
for(j = 0;j <= 2; ++j)
{
if (trie[ant][j]) aut[st][j] = trie[ant][j];
}
}
aut[tata[st]][tatam[st]] = st;
}
}
int st = 1;
int ans = 0;
for(i = 0;i <= n; ++i)
{
st = aut[st][a[i] - 'a'];
if (trie[st][0] == 0 && trie[st][1] == 0 && trie[st][2] == 0)
{
++ans;
}
}
printf("%d\n",ans);
return 0;
}