Cod sursa(job #1668433)

Utilizator dobrebogdanDobre Bogdan Mihai dobrebogdan Data 29 martie 2016 19:56:44
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 kb
#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;
}