Pagini recente » Istoria paginii oji2015_09_1 | Istoria paginii runda/barosanii | Cod sursa (job #2123772) | Cod sursa (job #766370) | Cod sursa (job #2087141)
#include <bits/stdc++.h>
using namespace std;
ifstream f("strmatch.in");
ofstream g("strmatch.out");
int countMatch = 0;
vector<int> makePrefix (string pattern) {
vector<int> F (pattern.length() + 1, 0);
int j = 0;
for (int i = 2; i <= pattern.length(); i++) {
while ((j > 0) && (pattern[j] != pattern[i - 1])) {
j = F[j];
}
if (pattern[j] == pattern[i - 1]) {
j = j + 1;
}
F[i] = j;
}
return F;
}
vector<int> kmp(string text, string pattern) {
vector<int> F = makePrefix(pattern);
int indexPattern = 0;
vector<int> solution;
for (int indexText = 0; indexText < text.length(); indexText++) {
while ((indexPattern > 0) && (text[indexText] != pattern[indexPattern])) {
indexPattern = F[indexPattern];
}
if (text[indexText] == pattern[indexPattern]) {
indexPattern++;
}
if(indexPattern == pattern.length()) {
countMatch++;
if(countMatch <= 1000) {
solution.push_back(indexText - indexPattern + 1);
}
indexPattern = F[indexPattern];
}
}
return solution;
}
int main()
{
vector <int> preffixMatch = makePrefix("ABABAC");
for (vector<int>::iterator it = preffixMatch.begin(); it != preffixMatch.end(); it++) {
cout<<*it<<" ";
}
string pattern, text;
f>>pattern>>text;
vector <int> solution = kmp(text, pattern);
g<<countMatch<<"\n";
for (vector<int>::iterator it = solution.begin(); it != solution.end(); it++) {
g<<*it<<" ";
}
return 0;
}