Pagini recente » Cod sursa (job #1796580) | Cod sursa (job #1354307) | Cod sursa (job #2944696) | Cod sursa (job #1313059) | Cod sursa (job #467723)
Cod sursa(job #467723)
//rabin karp
using namespace std;
#include<vector>
#include<iostream>
#include<fstream>
#include<cstring>
#define mod1 2000003
#define mod2 666013
#define baza 255
#define pb push_back
#define f(alfa) for(int i=1;i<=alfa;i++)
char a[2000003],p[2000003];
int n,m,h1p,h2p,h1a,h2a,pow1=1,pow2=1;
vector<int> v;
ofstream fout("strmatch.out");
void solve()
{
f(m-1)
{pow1*=baza;
pow1%=mod1;
pow2*=baza;
pow2%=mod2;
}
f(m)
{h1p=h1p*baza+p[i];
h1p%=mod1;
h2p=h2p*baza+p[i];
h2p%=mod2;
}
f(m)
{h1a=h1a*baza+a[i]; h1a%=mod1;
h2a=h2a*baza+a[i]; h2a%=mod2;
}
for(int i=0;i<=m-n;i++)
{
if(h1a==h1p)
if(h2a==h2p)
{v.pb(i);
}
h1a= baza*(h1a-pow1*a[i+1])+a[i+m+1];
}
fout<<v.size()<<"\n";
for(int i=0;i<=v.size()-1&&i<=1000;i++)
fout<<v[i]<<"\n";
}
void cit()
{
ifstream fin("strmatch.in");
fin.getline(p,2000003);
fin.getline(a,2000003);
}
int main()
{int i;
cit();
m=strlen(p);
n=strlen(a);
for(i=m;i>0;i--) p[i]=p[i-1];
for(i=n;i>0;i--) a[i]=a[i-1];
solve();
fout.close();
return 0;
}