Pagini recente » Cod sursa (job #1770839) | Cod sursa (job #2911190) | Cod sursa (job #1386398) | Cod sursa (job #1498509) | Cod sursa (job #2107252)
#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);
}