Pagini recente » Cod sursa (job #673822) | Cod sursa (job #1156611) | Cod sursa (job #723921) | Cod sursa (job #1286220) | Cod sursa (job #1526801)
#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())
{
long long base = 2573, m = 1000007;
long long key_hash = 0, rolling_hash = 0;
long long 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';
}