Pagini recente » Cod sursa (job #2923482) | Cod sursa (job #979147) | Cod sursa (job #243360) | Cod sursa (job #1909842) | Cod sursa (job #1741156)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("ahocorasick.in");
ofstream out("ahocorasick.out");
int Z[2*2000003];
int ZF(string s1, string s2) {
int left = 0;
int right = 0;
string s = s1 + "$" + s2;
int am = 0;
for(int i = 0; i < s.size(); i++) {
Z[i] = 0;
}
for(int k = 0; k < s.size(); k++) {
if(k > right) {
left = k;
right = k;
while(right < s.size() && s[right] == s[right-left])
right++;
Z[k] = right-left;
right--;
} else {
int p = k+Z[k-left];
if(p <= right)
Z[k] = Z[p];
else {
left = k;
while(right < s.size() && s[right] == s[right-left])
right++;
Z[k] = right-left;
right--;
}
}
am += (Z[k]==s1.size());
}
return am;
}
int main() {
string s1;
string s2;
in >> s1;
int n;
in >> n;
for(int i = 1; i <= n; i++) {
in >> s2;
out << ZF(s2, s1) << '\n';
}
return 0;
}