Cod sursa(job #1459494)

Utilizator retrogradLucian Bicsi retrograd Data 10 iulie 2015 00:49:17
Problema Aho-Corasick Scor 25
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <bits/stdc++.h>

using namespace std;
typedef int var;

ifstream fin("ahocorasick.in");
ofstream fout("ahocorasick.out");


vector<int64_t> V;
unordered_map<int64_t, var> Map;

#define MAXN 1000005
var Suff[MAXN], Start[MAXN];
char str[MAXN];
var n;

int64_t has(var a, var b) {
    int64_t h = Suff[a];
    h <<= 20;
    h += (b < n) ? Suff[b] : -1;
    return h;
}

void build() {
    for(n=0; str[n]; n++)
        Suff[n] = str[n] - 'a';

    for(var i=1; i<=n; i<<=1) {
        for(var j=0; j<n; j++)
            Map[has(j, j+i)] = 1;

        var val = 0;
        for(auto &p : Map) V.push_back(p.first);
        sort(V.begin(), V.end());
        for(auto v : V) Map[v] = val++;

        for(var j=0; j<n; j++)
            Suff[j] = Map[has(j, j+i)];

        Map.clear();
        V.clear();
    }

    for(var i=0; i<n; i++)
        Start[Suff[i]] = i;

}

char P[10005];
int main() {

    fin>>str;
    build();

    var M;
    for(M=1; M<=n; M<<=1);

    var m;
    fin>>m;
    while(m--) {
        fin>>P;
        var l = strlen(P);

        var p1 = -1, p2 = -1;
        for(var i=M; i; i>>=1) {
            if(p1 + i < n && strncmp(str + Start[p1+i], P, l) < 0)
                p1 += i;
            if(p2 + i < n && strncmp(str + Start[p2+i], P, l) <= 0)
                p2 += i;
        }

        fout<<p2-p1<<'\n';
    }

    return 0;
}