Cod sursa(job #3320984)

Utilizator popescuadrianpopescuadrian popescuadrian Data 7 noiembrie 2025 20:12:08
Problema Aho-Corasick Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
#include <fstream>
#include <queue>

using namespace std;
ifstream cin("ahocorasick.in");
ofstream cout("ahocorasick.out");
string s2;
int subs[1000005];
int fre[1000005];
int nxt[1000005][30];
int nodes=0;
int nod[1005];
int cnt[1000005];
int addtri(int curr,int poz,int dim)
{
    if(poz==dim)
    {
        subs[curr]++;
        return curr;
    }
    int cr=s2[poz]-'a';
    if(nxt[curr][cr]==0)
    {
        nodes++;
        nxt[curr][cr]=nodes;
    }
    return addtri(nxt[curr][cr],poz+1,dim);
}
queue<int>qu;
int main()
{
    int n,i;
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    string s;
    cin>>s;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>s2;
        nod[i]=addtri(0,0,s2.size());
    }
    qu.push(0);
    vector<int>order;
    while(qu.size())
    {
        int curr=qu.front();
        fre[curr]=1;
        order.push_back(curr);
        qu.pop();
        for(int i=0;i<26;i++)
        {
            if(nxt[curr][i]==0)
            {
                nxt[curr][i]=nxt[nxt[curr][26]][i];
            }
        }
        for(int i=0;i<26;i++)
        {
            if(fre[nxt[curr][i]]==0)
            {
                if(curr!=0)
                {
                    nxt[nxt[curr][i]][26]=nxt[nxt[curr][26]][i];
                }
                fre[nxt[curr][i]]=1;
                qu.push(nxt[curr][i]);
            }
        }
    }
    int curr=0;
    for(int i=0;i<s.size();i++)
    {
        curr=nxt[curr][(int)s[i]-'a'];
        cnt[curr]++;
    }
    while(order.size()>1)
    {
        cnt[nxt[order.back()][26]]+=cnt[order.back()];
        order.pop_back();
    }
    for(i=1;i<=n;i++)
    {
        cout<<cnt[nod[i]]<<'\n';
    }
    return 0;
}