Pagini recente » Cod sursa (job #1875912) | Cod sursa (job #1769414) | Cod sursa (job #2940874) | Cod sursa (job #726139) | Cod sursa (job #2450009)
#include <fstream>
#include <cstring>
#include <vector>
using namespace std;
ifstream fin("strmatch.in");
ofstream fout("strmatch.out");
vector <int> solution;
void computeLPSArray(char* pattern, int patternSize, int* lps);
void KMPSearch(char* pattern, char* text);
const int maxSizeText = 2000005;
char text[maxSizeText];
char pattern[maxSizeText];
int main()
{
fin >> pattern >> text;
KMPSearch(pattern, text);
int nrOfSolutions = solution.size();
fout << nrOfSolutions << '\n';
for (int i = 0; i < min(nrOfSolutions, 1000); ++i)
fout << solution[i] << ' ';
fin.close();
fout.close();
return 0;
}
void KMPSearch(char* pattern, char* text)
{
int patternSize = strlen(pattern);
int textSize = strlen(text);
int lps[patternSize];
computeLPSArray(pattern, patternSize, lps);
int i = 0, j = 0;
while (i < textSize)
{
if (pattern[j] == text[i])
++i, ++j;
if (j == patternSize)
{
solution.push_back(i - j);
j = lps[j - 1];
}
else if (i < textSize && pattern[j] != text[i])
{
if (j) j = lps[j - 1];
else ++i;
}
}
}
void computeLPSArray(char* pattern, int patternSize, int* lps)
{
int len = 0;
lps[0] = 0;
int i = 1;
while (i < patternSize)
{
if (pattern[i] == pattern[len])
lps[i++] = ++len;
else
{
if (len) len = lps[len - 1];
else lps[i++] = 0;
}
}
}