Pagini recente » Cod sursa (job #3183676) | Cod sursa (job #1179924) | Cod sursa (job #939739) | Cod sursa (job #703977) | Cod sursa (job #1226895)
#include <fstream>
#include <string>
#include <vector>
using namespace std;
void precomp (std::string s, std::vector<int>& v)
{
int len = s.length();
v.resize(len);
v[0] = 0;
for (int i=1; i<len; i++) {
if (s[v[i-1]] == s[i]) {
v[i] = v[i-1] +1;
}
else {
v[i] = 0;
if (s[i] == s[0]) v[i] = 1;
}
}
}
void to_upper (std::string& s)
{
for (std::string::iterator i=s.begin(); i<s.end(); i++) {
if (*i >= 97) *i -= 32;
}
}
int main()
{
ifstream in("strmatch.in");
ofstream out("strmatch.out");
string pattern, text;
in >> pattern >> text;
to_upper (pattern);
to_upper (text);
vector<int> x;
precomp(pattern, x);
int len = text.length(), j=0, pattlen = pattern.length();
vector<int> results;
for (int i=0; i<len; i++) {
if (text[i] == pattern[j]) {
j++;
}
else {
j = x[j-1];
}
if (j==pattlen) {
results.push_back(i-pattlen+1);
j = x[j-1];
if (results.size() == 1000) break;
}
}
out << results.size() << "\n";
for (vector<int>::iterator i=results.begin(); i<results.end(); i++) {
out << *i << " ";
}
for (int i=0; i<x.size(); i++) {
out << x[i];
}
}