Pagini recente » Cod sursa (job #91651) | Cod sursa (job #1604867) | Cod sursa (job #2644889) | Cod sursa (job #2654324) | Cod sursa (job #942360)
Cod sursa(job #942360)
#include <fstream>
#include <iostream>
#include <iterator>
#include <vector>
#include <string>
#define MAXN 2000005
using namespace std;
int SkipTable[MAXN];
void BuildSkipTable(const string& sPattern)
{
int iCandidateIndex = 0;
int iPatternLength = sPattern.length();
for (int i=2; i<iPatternLength; ++i)
{
while (sPattern[iCandidateIndex] not_eq sPattern[i-1] and iCandidateIndex > 0)
{
iCandidateIndex = SkipTable[iCandidateIndex];
}
if (sPattern[iCandidateIndex] == sPattern[i-1])
{
iCandidateIndex++;
SkipTable[i] = iCandidateIndex;
}
}
}
template <class Iter>
int kmp_search(const string& sPattern, const string& sText, Iter iter)
{
int matched = 0;
int iPatternIndex = 0;
int iPatternLengh = sPattern.length();
int iTextIndex = 0;
int iTextLength = sText.length();
while (iTextIndex < iTextLength)
{
while (sPattern[iPatternIndex] not_eq sText[iTextIndex] and iPatternIndex > 0)
{
iPatternIndex = SkipTable[iPatternIndex];
}
if (sPattern[iPatternIndex] == sText[iTextIndex])
{
iPatternIndex++;
if (iPatternIndex == iPatternLengh)
{
matched++;
if (matched <= 1000)
{
*iter = iTextIndex - iPatternIndex + 1;
iter++;
}
iPatternIndex = SkipTable[iPatternIndex - 1];
}
else
{
iTextIndex++;
}
}
else
{
iTextIndex++;
}
}
return matched;
}
int main()
{
string pattern;
string text;
vector<int> vMatches;
fstream fin("strmatch.in", fstream::in);
fstream fout("strmatch.out", fstream::out);
fin >> pattern >> text;
//cout << pattern << endl << text << endl;
BuildSkipTable(pattern);
const int iTotalMatches = kmp_search(pattern, text, back_inserter(vMatches));
fout << iTotalMatches << "\n";
ostream_iterator<int> itOut(fout, " ");
copy(vMatches.begin(), vMatches.end(), itOut);
fout << "\n";
fin.close();
fout.close();
return 0;
}