Pagini recente » Cod sursa (job #1761474) | Cod sursa (job #1494619) | Cod sursa (job #1879157) | Cod sursa (job #446949) | Cod sursa (job #98880)
Cod sursa(job #98880)
#include<stdio.h>
#include<vector>
#define vpi vector <pair <int,int> >
#define vpii vector <pair <int,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];
int tatam[maxn];
int nst;
char niv[maxn];
vpi vect;
int lung;
bool ver;
int m;
bool lit(char a)
{
return a >= 'a' && a <= 'z';
}
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;
while(!feof(stdin))
{
++m;
fgets(s,30,stdin);
lung = strlen(s) - 1;
while(!lit(s[lung]))
{
--lung;
}
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.pb(mkp(niv[nst],nst) );
}
cur = trie[cur][s[i] - 'a'];
}
}
sort(vect.begin(),vect.end());
for(i = 0;i <= 2; ++i)
{
aut[1][i] = 1;
}
for(vpii it = vect.begin(); it != vect.end(); ++it)
{
int st = (*it).ss;
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;
}