Pagini recente » Cod sursa (job #452703) | Cod sursa (job #823327) | Cod sursa (job #344130) | Cod sursa (job #1399595) | Cod sursa (job #1668433)
#include<cstdio>
#include<deque>
const int nmax=100000;
struct nod
{
nod * fiu[2],*fail,*tata;
int nr;
nod()
{
fiu[0]=fiu[1]=fail=tata=NULL;
nr=0;
}
};
nod * root;
deque<nod *> dq;
char si[nmax+5],s2[nmax+5];
void dfs(nod * rot,int bi)
{
if(root==NULL)
return ;
nod * tm=rot->tata->fail;
if(tm==NULL)
tm=root;
while(tm!=root)
{
if(tm->fiu[si[i]]!=NULL)
{
tm=tm->fiu[si[i]];
break;
}
else
{
tm=tm->fail;
}
}
rot->fail=tm;
for(int i=0;i<=1;i++)
if(rot->fiu[si[i]]!=NULL)
dfs(rot->fiu[si[i]],si[i]);
}
void calc(nod * rot)
{
rot->nr+=rot->fail->nr;
}
int main()
{
freopen("virus.in","r",stdin);
freopen("virus.out","w",stdout);
int ans=0,n,m,i,j,l,l1;
nod * tm;
root=new nod();
scanf("%d%d\n",&l1,&n);
gets(si+1);
for(i=1;i<=l1;i++)
si[i]-='0';
tm=root;
for(i=1;i<=n;i++)
{
scanf("%d\n",&l);
gets(s2+1);
for(j=1;j<=l;j++)
{
if(tm->fiu[s2[j]]==NULL)
{
tm->fiu[s2[j]]=new nod();
tm->fiu[s2[j]]->tata=tm;
}
tm=tm->fiu[s2[j]];
}
tm->nr++;
}
dfs(root->fiu[1],0);
dfs(root->fiu[0],0);
for(i=1;i<=n;i++)
{
scanf("%d\n",&l);
gets(s2+1);
rot=root;
for(j=1;j<=l;j++)
{
if(rot->fiu[s2[j]]==NULL)
break;
rot=rot->fiu[s2[j]];
}
if(j==l+1)
rot->nr++;
}
dq.push_back(root);
while(!dq.empty())
{
tm=dq.front();
if(tm!=root)
calc(tm);
for(i=0;i<=1;i++)
if(tm->fiu[i]!=NULL)
dq.push_back(tm->fiu[i]);
}
tm=root;
for(i=1;i<=l1;i++)
{
while(tm!=root)
{
if(tm->fiu[si[i]]!=NULL)
tm=tm->fiu[si[i]];
else
tm=tm->fail;
}
if(tm==root)
{
if(tm->fiu[si[i]]!=NULL)
tm=tm->fiu[si[i]];
}
if(tm!=root)
{
tm->co++;
}
}
return 0;
}