Pagini recente » Istoria paginii utilizator/noomercy | Cod sursa (job #2488170) | Cod sursa (job #2331943) | Cod sursa (job #817949) | Cod sursa (job #2304889)
#include <fstream>
#include <vector>
#include <string>
#define input "strmatch.in"
#define output "strmatch.out"
#define NMAX 2000010
using namespace std;
ifstream in(input);
ofstream out(output);
vector < int > positions;
string pattern1, text1;
char pattern[NMAX], text[NMAX];
int urmator[NMAX], pos_size, pattern_size, text_size;
int Min(int a, int b)
{
return a < b ? a : b;
}
void Read_Data()
{
in >> pattern1 >> text1;
pattern_size = pattern1.size(), text_size = text1.size();
for (unsigned i = 0; i < pattern_size; i++)
pattern[i + 1] = pattern1[i];
for (unsigned i = 0; i < text_size; i++)
text[i + 1] = text1[i];
}
void Prefix_Gen()
{
int pivot = 0;
for (unsigned i = 2; i <= pattern_size; i++)
{
while (pivot > 0 && pattern[pivot + 1] != pattern[i]) pivot = urmator[pivot];
if (pattern[pivot + 1] == pattern[i]) pivot++;
urmator[i] = pivot;
}
}
void Find_Matches()
{
int pivot = 0;
for (unsigned i = 1; i <= text_size; i++)
{
while (pivot > 0 && pattern[pivot + 1] != text[i]) pivot = urmator[pivot];
if (pattern[pivot + 1] == text[i]) pivot++;
if (pivot == pattern_size)
{
pos_size++;
positions.push_back(i - pattern_size);
}
}
}
void Print_Sol()
{
out << pos_size << "\n";
for (int i = 0; i < Min(positions.size(), 1000); i++)
out << positions[i] << " ";
}
int main()
{
Read_Data();
Prefix_Gen();
Find_Matches();
Print_Sol();
return 0;
}