Cod sursa(job #2304889)

Utilizator dey44andIoja Andrei-Iosif dey44and Data 18 decembrie 2018 19:14:43
Problema Potrivirea sirurilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#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;
}