Pagini recente » Cod sursa (job #1228291) | Cod sursa (job #19172) | Cod sursa (job #2959371) | Cod sursa (job #576534) | Cod sursa (job #841842)
Cod sursa(job #841842)
#include <fstream>
#include <iostream>
#include <string>
#include <iterator>
#include <vector>
#define MAXN 2000001
using namespace std;
int SkipTable[MAXN];
void BuildSkipTable(const string& sPattern)
{
int iCandidateIndex = 0;
int iPatternLength = sPattern.length();
for (int iPatternIndex = 2; iPatternIndex < iPatternLength; ++iPatternIndex)
{
while (sPattern[iCandidateIndex] != sPattern[iPatternIndex-1] && iCandidateIndex > 0)
{
iCandidateIndex = SkipTable[iCandidateIndex];
}
if (sPattern[iCandidateIndex] == sPattern[iPatternIndex-1])
{
++iCandidateIndex;
SkipTable[iPatternIndex] = iCandidateIndex;
}
}
}
template <typename Iter>
int KnuthMorrisPratt(const string& sPattern, const string& sText, Iter itOut)
{
int iPatternIndex = 0;
int iPatternLength = sPattern.length();
int iTextIndex = 0;
int iTextLength = sText.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;
if (iTotalMatched <= 1000)
{
*itOut = iTextIndex - iPatternLength + 1;
++itOut;
}
}
else
{
++iTextIndex;
}
}
else
{
++iTextIndex;
}
}
return iTotalMatched;
}
int main()
{
string sPattern;
string sText;
vector<int> vMatchedPositions;
fstream fin("strmatch.in", fstream::in);
fstream fout("strmatch.out", fstream::out);
fin >> sPattern >> sText;
//cout << sPattern << endl << sText << endl;
BuildSkipTable(sPattern);
const int iTotalMatched = KnuthMorrisPratt(sPattern, sText, back_inserter(vMatchedPositions));
fout << iTotalMatched << "\n";
ostream_iterator<int> itOut(fout, " ");
copy(vMatchedPositions.begin(), vMatchedPositions.end(), itOut);
fout << "\n";
fin.close();
fout.close();
}