Pagini recente » Cod sursa (job #2186809) | Cod sursa (job #3282798) | Cod sursa (job #2429924) | Cod sursa (job #669529) | Cod sursa (job #751931)
Cod sursa(job #751931)
#include <vector>
#include <string>
#include <fstream>
#include <cstdlib>
#include <iterator>
#include <algorithm>
using namespace std;
const int N_MAX=2000011;
string pattern, s;
vector<int> match;
int FailureFunction[N_MAX];
int main()
{
int patternSize, sSize, i, j, countMatch;
ifstream in("strmatch.in");
ofstream out("strmatch.out");
getline(in, pattern);
getline(in, s);
patternSize=pattern.size();
sSize=s.size();
for(i=2, j=0; i <= patternSize; ++i)
{
for(; pattern[i-1] != pattern[j] && j; j=FailureFunction[j]);
if(pattern[i-1] == pattern[j])
++j;
FailureFunction[i]=j;
}
pattern.push_back(' '); s.push_back(' ');
for(i=j=countMatch=0; i < sSize; )
{
if(pattern[j] == s[i])
{
++i, ++j;
if(patternSize == j)
{
++countMatch;
if(1000 >= countMatch)
match.push_back(i-patternSize);
}
}
else if(j)
j=FailureFunction[j];
else ++i;
}
out<<countMatch<<"\n";
copy(match.begin(), match.end(), ostream_iterator<int>(out, " "));
return EXIT_SUCCESS;
}