Pagini recente » Cod sursa (job #368272) | Cod sursa (job #2791157) | Cod sursa (job #3143214) | Cod sursa (job #1508334) | Cod sursa (job #832226)
Cod sursa(job #832226)
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
#include <iterator>
#include <algorithm>
#define MAXN 2000005
using namespace std;
int SkipTable[MAXN];
void BuildSkipTable(const string& sPattern)
{
int iCandidateIndex = 0;
int iPatternIndex = 2;
int iPatternLength = sPattern.length();
while (iPatternIndex < iPatternLength)
{
while (sPattern[iPatternIndex] != sPattern[iCandidateIndex] && iCandidateIndex > 0)
{
iCandidateIndex = SkipTable[iCandidateIndex];
}
if (sPattern[iPatternIndex] == sPattern[iCandidateIndex])
{
++iCandidateIndex;
SkipTable[iPatternIndex] = iCandidateIndex;
}
++iPatternIndex;
}
}
template <class OutputIterator>
int KnuthMorrisPratt(const string& sPattern, const string& sText, OutputIterator itOut)
{
int iTextIndex = 0;
int iPatternIndex = 0;
int iTextLength = sText.length();
int iPatternLength = sPattern.length();
int iTotalMatched = 0;
while (iTextIndex < iTextLength)
{
while (sText[iTextIndex] != sPattern[iPatternIndex] && iPatternIndex > 0)
{
iPatternIndex = SkipTable[iPatternIndex];
}
if (sText[iTextIndex] == sPattern[iPatternIndex])
{
++iPatternIndex;
if (iPatternIndex == iPatternLength)
{
iPatternIndex = SkipTable[iPatternLength-1];
++iTotalMatched;
*itOut = iTextIndex - iPatternLength + 1;
++itOut;
}
else
{
++iTextIndex;
}
}
else
{
++iTextIndex;
}
}
return iTotalMatched;
}
int main()
{
string sText, sPattern;
vector<int> vMatched;
fstream fin("strmatch.in", fstream::in);
fstream fout("strmatch.out", fstream::out);
fin >> sPattern >> sText ;
//cout << sText << endl << sPattern << endl;
BuildSkipTable(sPattern);
int iTotalMatched = KnuthMorrisPratt(sPattern, sText, back_inserter(vMatched));
fout << iTotalMatched << "\n";
ostream_iterator<int> itOut(fout, " ");
copy(vMatched.begin(), vMatched.end(), itOut);
fout << "\n";
fin.close();
fout.close();
return 0;
}