Pagini recente » Cod sursa (job #2017894) | Cod sursa (job #1700466) | Cod sursa (job #1773207) | Cod sursa (job #1297883) | Cod sursa (job #1331738)
#include <fstream>
#include <string>
#include <vector>
#include <cstring>
#define BASE 73
#define MOD 666013
int main()
{
std::string s1;
std::string s2;
std::ifstream f("strmatch.in");
std::ofstream g("strmatch.out");
std::getline(f, s1);
std::getline(f, s2);
f.close();
unsigned long long hash = 0;
for (auto &i : s1) {
hash = (hash * BASE + i) % MOD;
}
unsigned long long k = 0, l = -s1.length();
unsigned long long diff = 1;
for (unsigned long long i = 1; i < s1.length(); ++i)
diff = (diff * BASE) % MOD;
unsigned long long hash2 = 0;
std::vector<unsigned long long> sol;
for (auto i = s2.begin(), j = s2.begin() - s1.length(); i != s2.end(); ++i, ++j) {
if (k < s1.length() - 1) {
hash2 = (hash2 * BASE + (*i)) % MOD;
++k, ++l;
continue;
}
else if(k == (s1.length() - 1)){
hash2 = (hash2 * BASE + (*i)) % MOD;
}
else {
hash2 = hash2 - diff * (*j) + MOD;
hash2 = (hash2 * BASE + (*i)) % MOD;
}
++k, ++l;
if (hash == hash2 && !strncmp(s1.c_str(), s2.c_str() + l, s1.length())) {
sol.push_back(l);
}
}
g << sol.size() << "\n";
int found = 0;
for (auto &i : sol){
g << i << " ";
++found;
if (found == 1000)
break;
}
g.close();
}