Cod sursa(job #2546835)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 14 februarie 2020 17:01:20
Problema Aho-Corasick Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.02 kb
#include<bits/stdc++.h>
using namespace std;


const int sigma=26;
const int maxN=(1e2)+5;
const int maxL=(1e6)+5;
const int maxM=(1e4)+5;

char s[maxL],a[maxM];
struct trie
{
    trie *sons[sigma+5];
    trie *backEdge;
    int sol;
    vector<trie*> v;

    trie()
    {
        sol=0;
        for(int i=1;i<=sigma;i++)
            sons[i]=NULL;
        backEdge=NULL;
        v.clear();
    }
}*root=new trie();


trie *w[maxN];

inline int f(char c)
{
    return c-'a'+1;
}
inline trie* Insert(trie *node,char *s)
{
    if(*s==NULL) return node;

    int son=f(s[0]);

    if(!node->sons[son]) node->sons[son]=new trie();
    Insert(node->sons[son],s+1);
}

void dfs(trie *node)
{
    for(auto it:node->v)
    {
        dfs(it);
        node->sol+=it->sol;
    }
}

int n;

deque<trie*> q;

int main()
{
    freopen("ahocorasick.in","r",stdin);
    freopen("ahocorasick.out","w",stdout);

    scanf("%s",s+1);

    scanf("%d",&n);

    for(int i=1;i<=n;i++)
    {
        scanf("\n");
        scanf("%s",a);
        w[i]=Insert(root,a);
    }

    q.push_back(root);

    while(!q.empty())
    {
        trie *node=q.front();
        q.pop_front();

        for(int i=1;i<=sigma;i++)
        {
            if(node->sons[i])
            {
                trie* aux=node->backEdge;
                while(aux && !aux->sons[i]) aux=aux->backEdge;
                if(aux==NULL) node->sons[i]->backEdge=root;
                    else node->sons[i]->backEdge=aux->sons[i];

                node->sons[i]->backEdge->v.push_back(node->sons[i]);

                q.push_back(node->sons[i]);
            }
        }
    }



    trie* aux=root;

    int m=strlen(s+1);

    for(int i=1;i<=m;i++)
    {
        int son=f(s[i]);

        while(aux!=root && !aux->sons[son]) aux=aux->backEdge;
        if(aux->sons[son]) aux=aux->sons[son];
        aux->sol++;
    }
    dfs(root);

    for(int i=1;i<=n;i++)
        printf("%d\n",w[i]->sol);

    return 0;
}