Pagini recente » Cod sursa (job #1391336) | Cod sursa (job #1285525) | Cod sursa (job #1437754) | Cod sursa (job #723784) | Cod sursa (job #1526800)
#include <fstream>
#include <vector>
int main()
{
std::ifstream in("strmatch.in");
std::string data, key;
in >> key >> data;
std::vector<int> results;
if (key.size() <= data.size())
{
int base = 257, m = 1000007;
int key_hash = 0, rolling_hash = 0;
int p = 1;
for (unsigned i = 0; i < key.size(); i++)
{
key_hash = (key_hash * base + key[i]) % m;
rolling_hash = (rolling_hash * base + data[i]) % m;
p = (p * base) % m;
}
for (unsigned i = key.size(); i < data.size(); i++)
{
if (key_hash == rolling_hash)
results.push_back(i - key.size());
rolling_hash = (rolling_hash * base + data[i]) % m;
rolling_hash -= (p * data[i - key.size()]) % m;
if (rolling_hash < 0)
rolling_hash += m;
}
if (key_hash == rolling_hash)
results.push_back(data.size() - key.size());
}
std::ofstream out("strmatch.out");
out << results.size() << '\n';
unsigned s = std::min(1000, static_cast<int>(results.size()));
for (int i = 0; i < s; i++)
out << results[i] << ' ';
out << '\n';
}