Pagini recente » Cod sursa (job #108510) | Cod sursa (job #1841344) | Cod sursa (job #529514) | Cod sursa (job #109480) | Cod sursa (job #2814818)
#include <bits/stdc++.h>
using namespace std;
void suffixArray(const string& S, vector<int>& suff){
const int N = S.length();
const int LOG_N = 1 + floor(log2(N));
vector<vector<int>> c(2, vector<int>(N));
for(int i = 0; i < N; ++i){
c[0][i] = S[i] - 'a';
}
vector<pair<long long, int>> v(N);
for(int k = 1; k <= LOG_N; ++k){
int len = (1 << k);
int prevKParity = (k - 1) % 2;
int currentKParity = k % 2;
for(int i = 0; i < N; ++i){
int l = c[prevKParity][i];
int r = (i + len / 2 < N ? c[prevKParity][i + len / 2] : -1);
v[i].first = ((l + 1LL) << 20) | (r + 1LL);
v[i].second = i;
}
sort(v.begin(), v.end());
int classID = 0;
c[currentKParity][v[0].second] = 0;
for(int i = 1; i < N; ++i){
if(v[i - 1].first != v[i].first){
++classID;
}
c[currentKParity][v[i].second] = classID;
}
}
suff.resize(N);
const int LOG_N_PARITY = LOG_N % 2;
for(int i = 0; i < N; ++i){
suff[c[LOG_N_PARITY][i]] = i;
}
}
int lowerBound(const string& S, const string& WORD, vector<int>& suff){
const int N = S.length();
const int WORD_LEN = WORD.length();
int l = 0;
int r = N - 1;
while(l != r){
int mid = (l + r) / 2;
int i = suff[mid];
if(WORD.compare(0, WORD_LEN, S, i, WORD_LEN) <= 0){
r = mid;
}else{
l = mid + 1;
}
}
return r;
}
int upperBound(const string& S, const string& WORD, vector<int>& suff){
const int N = S.length();
const int WORD_LEN = WORD.length();
int l = 0;
int r = N;
while(l != r){
int mid = (l + r) / 2;
int i = suff[mid];
if(WORD.compare(0, WORD_LEN, S, i, WORD_LEN) < 0){
r = mid;
}else{
l = mid + 1;
}
}
return r;
}
int main(){
ifstream cin("ahocorasick.in");
ofstream cout("ahocorasick.out");
string s;
cin >> s;
vector<int> suff;
suffixArray(s, suff);
int n;
cin >> n;
vector<string> words(n);
for(int i = 0; i < n; ++i){
cin >> words[i];
}
for(int i = 0; i < n; ++i){
int firstPos = lowerBound(s, words[i], suff);
int lastPos = upperBound(s, words[i], suff);
cout << lastPos - firstPos << "\n";
}
cin.close();
cout.close();
return 0;
}