Cod sursa(job #2527294)

Utilizator MihneaGhiraMihnea MihneaGhira Data 19 ianuarie 2020 22:55:20
Problema Aho-Corasick Scor 15
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.87 kb
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream fin("ahocorasick.in");
ofstream fout("ahocorasick.out");
int n;
char a[1000010],s[10010];
struct trie {
    int nr;
    trie *fii[26];
    trie *BACK;
    vector<trie*> v;
    trie(){
        nr=0;
        BACK=0;
        for(int i=0;i<26;i++)
            fii[i]=0;
    }
};
trie *rad=new trie;
trie *nod,*fiu;
trie *w[102];
queue<trie*>q;

trie *insert(trie *nod,char *point){
    if(*point==0){
        return nod;
    }
    if(nod->fii[*point-'a']==0){
        nod->fii[*point-'a']=new trie;
    }
    return insert(nod->fii[*point-'a'],point+1);
}

void dfs(trie *nod){
    for(int i=0;i<nod->v.size();i++) {
        dfs(nod->v[i]);
        nod->nr+=nod->v[i]->nr;
    }
}

int main(){
    fin>>a;
    fin>>n;
    for(int i=1;i<=n;i++){
        fin>>s;
        w[i]=insert(rad,s);
    }
    q.push(rad);
    while( !q.empty() ){
        nod=(trie*)q.front();
        q.pop();
        for(int i=0;i<26;i++)
            if(nod->fii[i]){
                fiu=nod->BACK;

                while(fiu && fiu->fii[i]==0){
                    fiu=fiu->BACK;
                }
                if(!fiu){
                    nod->fii[i]->BACK=rad;
                }
                else{
                    nod->fii[i]->BACK=fiu->fii[i];
                }
                nod->fii[i]->BACK->v.push_back(nod->fii[i]);
                q.push(nod->fii[i]);
            }
    }
    char *point;
    for(point=a,fiu=rad ;*point!=0; point++){

        while(fiu->fii[*point-'a']==0 && fiu){
            fiu=fiu->BACK;
        }
        if(fiu==0){
            fiu=rad;
        }
        else{
            fiu=fiu->fii[*point-'a'];
        }
        fiu->nr++;
    }
    dfs(rad);

    for(int i=1;i<=n;i++){
        fout<<w[i]->nr<<"\n";
    }
    return 0;
}