Pagini recente » Cod sursa (job #2936126) | Cod sursa (job #2517072) | Cod sursa (job #2971658) | Cod sursa (job #1121101) | Cod sursa (job #1764160)
#include <iostream>
#include <fstream>
#include <unordered_map>
#include <string>
#include <vector>
#include <algorithm>
#include <limits>
using namespace std;
ifstream in("strmatch.in");
ofstream out("strmatch.out");
void Rabin_Karp(string &T, string &P, vector<int> &pos)
{
if(P.size()> T.size())
return;
int base = 101,prime = 14107,hpattern = 0,hs = 0;
prime = numeric_limits<int>::max();
int n = T.length();
int m = P.length();
int power[m];
power[0] = 1;
for(int i = 1; i < m ; i ++)
power[i] = (power[i-1]*base) % prime;
for(int i = 0 ; i < m ; i++)
{
hpattern = ( hpattern + power[ m-1 - i] * P[ i ] ) % prime,
hs = (hs + power[m-1 -i]*T[i]) % prime;
}
bool ok = true;
for(int s = 0 ; s <= n-m ; s++)
{
if (hs == hpattern)
{
ok = true;
for(int i = 0 ; i < m ; i ++)
if (P[i] != T[s+i])
ok = false;
if(ok)
pos.push_back(s);
}
if(s < n-m)//update hash(rolling hash)
hs = ( base *(hs - T[s] * power[m-1]) + T[ s + m ] ) % prime;
}
}
int main()
{
vector< int > pos;
string T,P;
in >> P >> T;
Rabin_Karp(T,P,pos);
out<<pos.size()<<'\n';
for( int i = 0;i < min(1000,(int)pos.size());i++)
out<<pos[i]<<" ";
return 0;
}