Cod sursa(job #3230914)

Utilizator hhhhhhhAndrei Boaca hhhhhhh Data 23 mai 2024 13:20:23
Problema Aho-Corasick Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.82 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("ahocorasick.in");
ofstream fout("ahocorasick.out");
int go(int,int);
int getsuf(int);
string v;
int n,where[100005];
struct node
{
    int go[26];
    int lit,par,suflink;
    int niv;
    int dp;
} emp;
vector<node> t;
void add(string s,int ind)
{
    int me=0;
    for(char c:s)
    {
        int lit=c-'a';
        if(t[me].go[lit]==-1)
        {
            int x=t.size();
            t.push_back(emp);
            t[x].lit=lit;
            t[x].niv=t[me].niv+1;
            t[x].par=me;
            t[me].go[lit]=x;
        }
        me=t[me].go[lit];
    }
    where[ind]=me;
}
int go(int me,int lit)
{
    if(t[me].go[lit]!=-1)
        return t[me].go[lit];
    if(me==0)
        return 0;
    t[me].go[lit]=go(getsuf(me),lit);
    return t[me].go[lit];
}
int getsuf(int me)
{
    if(t[me].suflink!=-1)
        return t[me].suflink;
    if(t[me].niv<=1)
        return 0;
    t[me].suflink=go(getsuf(t[me].par),t[me].lit);
    return t[me].suflink;
}
bool byniv(int a,int b)
{
    return t[a].niv>t[b].niv;
}
int main()
{
    ios_base::sync_with_stdio(false);
    fin.tie(0);
    for(int i=0;i<26;i++)
        emp.go[i]=-1;
    emp.lit=-1;
    emp.par=-1;
    emp.suflink=-1;
    emp.dp=0;
    emp.niv=0;
    t.push_back(emp);
    fin>>v;
    fin>>n;
    for(int i=1;i<=n;i++)
    {
        string s;
        fin>>s;
        add(s,i);
    }
    int me=0;
    for(char c:v)
    {
        int lit=c-'a';
        me=go(me,lit);
        t[me].dp++;
    }
    vector<int> ord;
    for(int i=1;i<t.size();i++)
        ord.push_back(i);
    sort(ord.begin(),ord.end(),byniv);
    for(int i:ord)
        t[getsuf(i)].dp+=t[i].dp;
    for(int i=1;i<=n;i++)
        fout<<t[where[i]].dp<<'\n';
    return 0;
}