Pagini recente » Cod sursa (job #80566) | Cod sursa (job #1984460) | Cod sursa (job #1594002) | Cod sursa (job #847899) | Cod sursa (job #856321)
Cod sursa(job #856321)
#include <algorithm>
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
const int MAX_N = 2000100;
string text;
string pattern;
int prefix[MAX_N];
vector<int> matches;
void read(), solve(), print();
void compute_prefix(const string pattern);
void find_match(const string text, const string pattern);
int main() {
read();
solve();
print();
return 0;
}
void read() {
ifstream fin("strmatch.in");
getline(fin, pattern);
getline(fin, text);
pattern = ' ' + pattern;
text = ' ' + text;
}
void solve() {
compute_prefix(pattern);
find_match(text, pattern);
}
void compute_prefix(const string pattern) {
int N = pattern.size() - 1;
prefix[1] = 0;
int p = 0;
for (int i = 2; i <= N; ++i) {
while (p > 0 && pattern[p+1] != pattern[i]) p = prefix[p];
if (pattern[p+1] == pattern[i]) ++p;
prefix[i] = p;
}
}
void find_match(const string text, const string pattern) {
int N = text.size() - 1;
int M = pattern.size() - 1;
int p = 0;
for (int i = 1; i <= N; ++i) {
while (p > 0 && pattern[p+1] != text[i]) p = prefix[p];
if (pattern[p+1] == text[i]) ++p;
if (p == M) {
matches.push_back(i - M);
p = prefix[p];
}
}
}
void print() {
ofstream fout("strmatch.out");
fout << matches.size() << '\n';
for (unsigned int i = 0; i < matches.size() && i < 1000; ++i) {
fout << matches[i] << ' ';
}
}