Pagini recente » Cod sursa (job #584593) | Cod sursa (job #1394648) | Cod sursa (job #1263224) | Cod sursa (job #990037) | Cod sursa (job #2485197)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
const int mod1=2000003,mod2=2000029,maxstr=2000005,maxn=1003,baza=256;
int sol[maxn],nr,n,m,hashmic1,hashmic2,hash1,hash2,putere1=1,putere2=1;
char mic[maxstr],mare[maxstr];
void citire()
{
ifstream fin("strmatch.in");
fin.getline(mic,maxstr);
fin.getline(mare,maxstr);
n=strlen(mic);
m=strlen(mare);
}
void hashuri()
{
for(int i=0;i<n;i++)
{
hashmic1=(hashmic1*baza+mic[i])%mod1;
hashmic2=(hashmic2*baza+mic[i])%mod2;
hash1=(hash1*baza+mare[i])%mod1;
hash2=(hash2*baza+mare[i])%mod2;
if(i)
{
putere1=(putere1*baza)%mod1;
putere2=(putere2*baza)%mod2;
}
}
}
void rezolvare()
{
if(hashmic1==hash1&&hashmic2==hash2)
sol[nr++]=0;
for(int i=n;i<m;i++)
{
hash1=((hash1-putere1*mare[i-n]%mod1+mod1)*baza+mare[i])%mod1;
hash2=((hash2-putere2*mare[i-n]%mod2+mod2)*baza+mare[i])%mod2;
if(hashmic1==hash1&&hashmic2==hash2)
if(nr<1000)
sol[nr++]=i-n+1;
}
}
void afisare()
{
ofstream fout("strmatch.out");
fout<<nr<<"\n";
if(nr>1000)
nr=1000;
for(int i=0;i<nr;i++)
fout<<sol[i]<<" ";
}
int main()
{
citire();
hashuri();
rezolvare();
afisare();
return 0;
}