Pagini recente » Cod sursa (job #1150714) | Cod sursa (job #200446) | Cod sursa (job #243740) | Cod sursa (job #2928566) | Cod sursa (job #2317098)
#include <fstream>
#include <string.h>
#include <deque>
#define nmax 50000
#define L 10000000
#define l 20
using namespace std;
int n,val[nmax+5],p[nmax+5],s=0;
char text[L+5],cuv[l+5];
struct trie
{
int k,val;
trie* fiu[3],*fail;
trie()
{
val=0;
k=0;
memset(fiu,0,sizeof(fiu));
}
}*v;
deque<trie*> q1,q2;
void add(int k, char *charr)
{
trie *d=v;
while(*charr!='\0')
{
if(!d->fiu[charr[0]-'a'])
d->fiu[charr[0]-'a']=new trie;
d=d->fiu[charr[0]-'a'];
charr++;
}
if(d->k==0)
d->k=k;
p[k]=d->k;
}
void link()
{
v->fail=v;
trie *d,*f;
for(int i=0;i<3;i++)
if(v->fiu[i])
q1.push_back(v->fiu[i]),v->fiu[i]->fail=v;
while(!q1.empty())
{
d=q1.front();
q1.pop_front();
q2.push_back(d);
for(int i=0;i<3;i++)
if(d->fiu[i])
{
f=d->fail;
while(f!=v && !f->fiu[i])
f=f->fail;
if(f->fiu[i])
d->fiu[i]->fail=f->fiu[i];
else
d->fiu[i]->fail=v;
q1.push_back(d->fiu[i]);
}
}
}
void match(char *a)
{
trie* d=v;
while(*a)
{
while(d!=v && !d->fiu[a[0]-'a'])
d=d->fail;
if(d->fiu[a[0]-'a'])
d=d->fiu[a[0]-'a'];
d->val++;
a++;
}
}
void solve()
{
trie *d;
while(!q2.empty())
{
d=q2.back();
q2.pop_back();
d->fail->val+=d->val;
if(!val[d->k])
val[d->k]=d->val;
}
}
int main()
{
ifstream fin("abc2.in");
ofstream fout("abc2.out");
fin>>text;
v=new trie;
for(n=1;fin>>cuv;n++)
add(n,cuv);
link();
match(text);
solve();
for(int i=1;i<n;i++)
s+=val[i];
fout<<s<<"\n";
return 0;
}