Pagini recente » Borderou de evaluare (job #196804) | Cod sursa (job #925445)
Cod sursa(job #925445)
#include <string>
#include <vector>
#include <fstream>
#include <iterator>
#include <algorithm>
using namespace std;
const int NMAX = 2000011;
const int SOLMAX = 1000;
int fFailure[NMAX];
vector<int> matchIdx;
inline int min(const int& x, const int& y) {return x <= y ? x : y;}
void buildFFailure(string& pattern)
{
int M, i, j;
M = pattern.size();
j = fFailure[0] = fFailure[1] = 0;
for(i = 2; i <= M; ++i)
{
for(; pattern[i - 1] != pattern[j] && j; j = fFailure[j]);
if(pattern[i - 1] == pattern[j]) ++j;
fFailure[i] = j;
}
}
void KMP(string& pattern, string& s)
{
int N, M, i, j;
N = s.size();
M = pattern.size();
pattern.push_back(' ');
buildFFailure(pattern);
for(i = j = 0; i < N; )
{
if(s[i] == pattern[j])
{
++j; ++i;
if(M == j)
{
matchIdx.push_back(i - M);
}
}
else if(j)
j = fFailure[j];
else ++i;
}
pattern.erase(pattern.end() - 1);
}
int main()
{
string s, pattern;
ifstream in("strmatch.in");
ofstream out("strmatch.out");
getline(in, pattern);
getline(in, s);
KMP(pattern, s);
out << matchIdx.size() << '\n';
copy(matchIdx.begin(), matchIdx.begin() + min(SOLMAX, matchIdx.size()), ostream_iterator<int>(out, " "));
out << '\n';
return EXIT_SUCCESS;
}