Pagini recente » Cod sursa (job #2530237) | Cod sursa (job #2530119) | Cod sursa (job #2288456) | Cod sursa (job #1060350) | Cod sursa (job #1790474)
#include <fstream>
#include <string>
#include <vector>
using namespace std;
vector<int> AflaPrefix(const string &s)
{
vector<int> prefix(s.size(), 0);
int lung = 0;
for (unsigned i = 1; i < s.size(); ++i) {
while (lung > 0 && s[i] != s[lung])
lung = prefix[lung - 1];
if (s[i] == s[lung])
++lung;
prefix[i] = lung;
}
return prefix;
}
vector<int> AflaPotriviri(const string &sir, const string &model, int &nr_rasp)
{
auto prefix = AflaPrefix(model);
vector<int> pozitii;
nr_rasp = 0;
unsigned lung = 0;
for (unsigned i = 0; i < sir.size(); ++i) {
while (lung > 0 && sir[i] != model[lung])
lung = prefix[lung - 1];
if (sir[i] == model[lung])
++lung;
if (lung == model.size()) {
++nr_rasp;
if (pozitii.size() < 1000)
pozitii.push_back(i - lung + 1);
}
}
return pozitii;
}
int main()
{
ifstream fin("strmatch.in");
ofstream fout("strmatch.out");
string cautat;
getline(fin, cautat);
string sir;
getline(fin, sir);
int nr_potriviri = 0;
auto pozitii = AflaPotriviri(sir, cautat, nr_potriviri);
fout << nr_potriviri << "\n";
for (int poz : pozitii)
fout << poz << " ";
return 0;
}