Cod sursa(job #3209564)

Utilizator Raul_AArdelean Raul Raul_A Data 2 martie 2024 20:03:12
Problema Aho-Corasick Scor 95
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.99 kb
#include <bits/stdc++.h>
#define int unsigned int
#define MAX 1000001
#define base 666013
#define eb emplace_back
using namespace std;

const string fn("ahocorasick");

ifstream in(fn + ".in");
ofstream out(fn + ".out");

#define cin in
#define cout out

string s, t, ans;

int fact[MAX], _hash[MAX], _1[201], _2[40401];
int n, i, nh, mx, q;

vector<int> g[100001];

int get_hash(int st, int dr)
{
    int answer = (_hash[dr + 1] - _hash[st] * fact[dr - st + 1]);
    return answer;
}

signed main()
{

    cin >> s;
    fact[0] = 1;
    for (i = 1; i <= s.size(); i++)
        fact[i] = (fact[i - 1] * base);

    _hash[2] = s[0];
    for (i = 2; i <= s.size(); i++)
        _hash[i + 1] = (_hash[i] * base + s[i - 1]);

    for (i = 0; i < s.size() - 2; i++)
    {
        int aux = (s[i] * 4) + s[i + 1] * 2 + s[i + 2];
        g[aux].eb(i + 1);
        _1[s[i]] += 1;
        aux = s[i] * 100 + s[i + 1];
        _2[aux]++;
    }
    _1[s[s.size() - 1]]++;
    _1[s[s.size() - 2]]++;
    int aux = s[s.size() - 2] * 100 + s[s.size() - 1];
    _2[aux]++;

    cin >> q;
    while (q--)
    {
        cin >> t;
        nh = 0;
        for (i = 0; i < t.size(); i++)
            nh = (nh * base + t[i]);

        if (t.size() == 1)
        {
            int mx=0;
            if (_1[t[0]] > mx)
                mx = _1[t[0]];
            cout<<mx<<'\n';
        }
        else if (t.size() == 2)
        {
            int aux = t[0] * 100 + t[1];
            int mx=0;
            if (_2[aux] > mx)
                mx = _2[aux];
            cout<<mx<<'\n';
        }

        else
        {
            int aux = t[0] * 4 + t[1] * 2 + t[2];
            int cnt = 0;
            for (auto x : g[aux])
            {
                if (x + t.size() - 1 > s.size())
                    break;
                if (get_hash(x, x + t.size() - 1) == nh)
                    ++cnt;
            }
            cout<<cnt<<'\n';
        }
    }
    return 0;
}