Pagini recente » Borderou de evaluare (job #172811) | Borderou de evaluare (job #1352612) | Borderou de evaluare (job #2160705) | Cod sursa (job #3245473) | Cod sursa (job #3004215)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("strmatch.in");
ofstream fout("strmatch.out");
const long long mod1 = 1000000007;
const long long mod2 = 1000000080;
const long long baza1 = 250;
const long long baza2 = 200;
long long power1 = 1, power2 = 1;
int hashh(string s, long long mod, long long baza)
{
long long r = 0;
for (long long i = 0; i < s.size(); i++)
{
r = r * baza + s[i];
r %= mod;
}
return r;
}
vector<long long> poz;
void rabin_karp(string sir, string pat)
{
long long cnt = 0;
long long h1 = hashh(pat, mod1, baza1);
long long h2 = hashh(pat, mod2, baza2);
long long hh1 = 0;
long long hh2 = 0;
for (long long i = 0; i < pat.size(); i++)
{
power1 = (power1 * baza1) % mod1;
power2 = (power2 * baza2) % mod2;
}
for (long long i = 0; i < sir.size(); i++)
{
hh1 = hh1 * baza1 + sir[i];
hh1 %= mod1;
hh2 = hh2 * baza2 + sir[i];
hh2 %= mod2;
if (i >= pat.size())
{
hh1 -= (power1 * sir[i - pat.size()]) % mod1;
if (hh1 < 0)
{
hh1 += mod1;
}
hh2 -= (power2 * sir[i - pat.size()]) % mod2;
if (hh2 < 0)
{
hh2 += mod2;
}
}
if (i >= pat.size() - 1 && hh1 == h1 && hh2 == h2)
{
cnt++;
poz.push_back(i - (pat.size() - 1));
}
}
fout << cnt << '\n';
int len = min(1000, (int)poz.size());
for (long long i = 0; i < len; i++)
{
fout << poz[i] << ' ';
}
}
int main()
{
string sir, pat;
fin >> pat >> sir;
rabin_karp(sir, pat);
return 0;
}