Pagini recente » Cod sursa (job #1802066) | Cod sursa (job #2429284) | Cod sursa (job #1320894) | Cod sursa (job #1846038) | Cod sursa (job #2536034)
#include <fstream>
#include <string>
#include <algorithm>
#include <string>
using namespace std;
int n, m;
int mod1, mod2;
string A, B;
vector<int> v;
ifstream f("strmatch.in");
ofstream g("strmatch.out");
int nr;
void RabinKarp()
{
int amod1=0, amod2=0;
int bmod1=0, bmod2=0;
for(int i = 0; i < m; i++)
{
bmod1 = (bmod1 * 27 + (B[i]-'a'+1)) % mod1;
bmod2 = (bmod2 * 27 + (B[i]-'a'+1)) % mod2;
}
for(int i = 0; i < m; i++)
{
amod1 = (amod1 * 27 + (A[i]-'a'+1)) % mod1;
amod2 = (amod2 * 27 + (A[i]-'a'+1)) % mod2;
}
if(amod1 == bmod1 && amod2 == bmod2)
{
nr++;
v.push_back(0);
}
int p1=1;
for(int i = 1; i < m; i++)
p1 = (p1 * 27) % mod1;
int p2=1;
for(int i = 1; i < m; i++)
p2 = (p2 * 27) % mod2;
for(int i = m; i < n; i++)
{
amod1 = (((amod1 - p1 * (A[i - m]-'a'+1)) * 27 + (A[i]-'a'+1)) % mod1 + mod1) % mod1;
amod2 = (((amod2 - p2 * (A[i - m]-'a'+1)) * 27 + (A[i]-'a'+1)) % mod2 + mod2) % mod2;
if(amod1 == bmod1 && amod2 == bmod2)
{
nr++;
v.push_back(i);
if(nr == 1000)
break;
}
}
}
int main()
{
f>>B;
f>>A;
n = A.size();
m = B.size();
mod1 = 666013;
mod2 = 666013;
RabinKarp();
g<<nr<<endl;
for(int i = 0; i < nr; i++)
g<<(v[i] - m + 1)<<" ";
}