Pagini recente » Cod sursa (job #1654401) | Cod sursa (job #2297329) | Cod sursa (job #2697743) | Cod sursa (job #787289) | Cod sursa (job #1459494)
#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;
}