Pagini recente » Cod sursa (job #2873088) | Cod sursa (job #1126162) | Cod sursa (job #997205) | Cod sursa (job #1600237) | Cod sursa (job #2739234)
#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 prime1 = 13;
const int prime2 = 29;
unsigned hash(const std::string& s, int start, int end, int prime)
{
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 pathash1 = hash(pattern, 0, patSize - 1,prime1);
unsigned pathash2 = hash(pattern, 0, patSize - 1,prime2);
unsigned shash1 = hash(s, 0, patSize - 1,prime1);
unsigned shash2 = hash(s, 0, patSize - 1,prime2);
unsigned p1 = 1,p2 = 1;
for (int i = 1; i < patSize; i++)
{
p1 *= prime1;
p2 *= prime2;
}
for (int i = 0; i <= sSize - patSize; ++i)
{
if (pathash1 == shash1 && pathash2 == shash2)
{
if (count < 1000)
apar[count] = i;
count++;
}
if (i + patSize < sSize)
shash1 = (shash1 - p1 * s[i]) * prime1 + s[i + patSize] ;
shash2 = (shash2 - p2 * s[i]) * prime2 + 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);
}