Pagini recente » Cod sursa (job #1354722) | Cod sursa (job #1142706) | Cod sursa (job #1904419) | Cod sursa (job #539480) | Cod sursa (job #2232006)
#include <fstream>
#include <vector>
#include <string>
using namespace std;
ifstream fin("strmatch.in");
ofstream fout("strmatch.out");
string pattern, text, zString;
vector<int> Z(4000001);
int patternApparitions = 0;
void buildZArray() {
int L, R;
L = R = 0;
for (int i = 1; i < zString.size(); ++i) {
if (i > R) {
int count = 0;
L = R = i;
while (i + count < zString.size() && zString[count] == zString[i + count]) {
count++;
}
Z[i] = count;
if (count != 0) {
R = R + count - 1;
}
} else {
int k = i - L;
if (Z[k] < R - i + 1) {
Z[i] = Z[k];
}
else {
int count = 0;
L = i;
while (R + count + 1 < zString.size() && zString[R - i + 1 + count] == zString[R + count + 1]) {
count++;
}
R = R + count;
Z[i] = R - L + 1;
}
}
if (Z[i] == pattern.size()) {
patternApparitions++;
}
}
}
int main() {
getline(fin, pattern);
getline(fin, text);
zString = pattern + "$" + text;
buildZArray();
fout << patternApparitions << '\n';
int count = 0;
for (int i = 0; i < zString.size(); ++i) {
if (Z[i] == pattern.size()) {
fout << i - pattern.size() - 1 << ' ';
count++;
if (count == 1000) {
return 0;
}
}
}
return 0;
}