Pagini recente » Cod sursa (job #3130597) | Cod sursa (job #3264788) | Cod sursa (job #2469368) | Cod sursa (job #2097465) | Cod sursa (job #2739233)
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <cmath>
std::ifstream f("strmatch.in");
std::ofstream g("strmatch.out");
typedef unsigned long long ULL;
const int prime = 13;
unsigned hash(const std::string& s, int start, int end)
{
unsigned h = 0, p = 1;
for (int i = end; i>=start;--i)
{
h += s[i] * p;
p *= prime;
}
return h;
}
void find(const std::string& s, const std::string& pattern)
{
int patSize = pattern.size();
int sSize = s.size();
int count = 0;
int apar[1000] = { 0 };
unsigned pathash = hash(pattern, 0, patSize - 1);
unsigned shash = hash(s, 0, patSize - 1);
unsigned p = 1;
for (int i = 1; i < patSize; i++)
p = (p * prime);
for (int i = 0; i <= sSize - patSize; ++i)
{
if (pathash == shash)
{
bool ok = true;
for (int k = 0; ok && k < patSize; ++k)
if (s[i + k] != pattern[k])ok = false;
if (ok)
{
if (count < 1000)
apar[count] = i;
count++;
}
}
if (i + patSize < sSize)
shash = (shash - p * s[i]) * prime + s[i + patSize] ;
}
g << count << '\n';
int aparSize = std::min(1000, count);
for (int i = 0; i < aparSize; ++i)
g << apar[i] << ' ';
}
int main()
{
std::string s, p;
f >> p >> s;
find(s, p);
}