Cod sursa(job #2107252)

Utilizator AlexnolifeAlexandru Ica Alexnolife Data 16 ianuarie 2018 21:36:06
Problema Potrivirea sirurilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <cstdio>
#include <fstream>
#include <string>
#include <list>
#include <algorithm>

/*
 * fullstr e sirul intreg
 * substr e subsirul
 */
void Solve(std::string& fullstr, std::string& substr)
{
	std::ofstream outputFile("strmatch.out");
	/* 
	 * Prima data trebuie afisat numarul de aparitii
	 * lista memoreaza pozitiile la care s-a gasit subsirul 
	 */
	std::list<std::size_t> appearance_stream;

	/* De cate ori a aparut subsirul in sir */
	std::size_t numberOfAppearances = 0;

	/* Prima aparitie */
	std::size_t pos = fullstr.find(substr, 0);

	/* npos e returnat daca nu s-a gasit subsirul */
	while(pos != std::string::npos) {
		appearance_stream.emplace_back(pos);
		numberOfAppearances++;

		/* cauta de la urmatoarea pozitie */
		pos = fullstr.find(substr, pos + 1);
	}

	/* Scrie numarul de aparitii */
	outputFile << numberOfAppearances << "\n";
	/* scrie toate pozitiile la care s-a gasit subsirul */
	std::for_each(appearance_stream.begin(),
			      appearance_stream.end(),
		          [&outputFile](const std::size_t& position) { outputFile << position << "  "; });
}

int main()
{
	std::ifstream inputFile("strmatch.in");

	std::string fullString;
	std::string substring;

	/* lungimea maxima pt siruri e 2 mil caractere */
	fullString.reserve(2000000);
	substring.reserve(2000000);

	/* citeste sirurile */
	std::getline(inputFile, substring);
	std::getline(inputFile, fullString);

	/* Scrie in strmatch.out rezultatele */
	Solve(fullString, substring);
}