Cod sursa(job #1535307)

Utilizator timicsIoana Tamas timics Data 24 noiembrie 2015 16:34:31
Problema Aho-Corasick Scor 35
Compilator cpp Status done
Runda Arhiva educationala Marime 2.1 kb
#include<fstream>
#include<iostream>
#include <cstdio>
#include <string>
#include <vector>
#define pb push_back
using namespace std;

int N, r1[1000100],r[1000100];
int Q[1000100],st,dr;
vector<int> sol,g[1000100];
 
struct Trie {
    int ind;
    Trie *q[26], *f;
    Trie(int x) {
        ind = x;
        for(int i=0;i<26;++i) q[i] = 0;
    }
};
 
vector<Trie*> v; 
 
void ins(Trie *nod, string &s, int poz) {
    if(poz == s.size()) {
        sol.pb(nod->ind); return;
    }
    int c = s[poz] - 'a';
    if(nod->q[c]==0) {
        Trie *nt = new Trie(v.size());
        v.pb(nt); nod->q[c] = nt;
    }
    ins(nod->q[c],s,poz+1);
}
 
void make_fail() {
    for(int i=0;i<26;++i) {
        if(v[0]->q[i] == 0) continue;
        Trie *y = v[0]->q[i];
        Q[dr++] = y->ind;
        y->f = v[0];
        g[0].pb(y->ind);
    }
    while(st < dr) {
        int x = Q[st++];
        for(int i=0;i<26;++i) {
            if(v[x]->q[i] == 0) continue; 
            Trie *y = v[x]->q[i];
            Trie *curr = v[x]->f;
            while(curr != 0 && curr->q[i] == 0) curr = curr->f;
            if(curr == 0) y->f = v[0];
            else y->f = curr->q[i];
            g[y->f->ind].pb(y->ind);
            Q[dr++] = y->ind;
        }
    }
}
 
void dfs(int x) {
    r[x] = r1[x];
    for(auto y: g[x]) {
        dfs(y); r[x] += r[y];
    }
}
 
void do_magic(string &s) {
    int L = s.size();
    Trie *curr = v[0];
    for(int i=0;i<L;++i) {
        int c = s[i]-'a';
        while(curr != 0 && curr->q[c] == 0) {
            curr = curr->f;
        }
        if(curr == 0) {
            curr = v[0];
        } else {
            ++r1[curr->q[c]->ind];
            curr = curr->q[c];
        }
    }
    dfs(0);
}

void make_aho() {
    string a,b;
    cin>>a>>N;
    Trie *T = new Trie(0);
    v.pb(T);
    for(int i=1;i<=N;++i) {
        cin>>b;
        ins(T,b,0);
    }
    make_fail();
    do_magic(a);
    for(auto x: sol) {
        cout<<r[x]<<"\n";
    }
}

 
int main() {
    std::ios_base::sync_with_stdio (false); 
    freopen("ahocorasick.in","r",stdin);
    freopen("ahocorasick.out","w",stdout);
    make_aho(); 
    return 0;
}