Pagini recente » Cod sursa (job #1036070) | Cod sursa (job #713368) | Cod sursa (job #2201138) | Cod sursa (job #1344140) | Cod sursa (job #2284508)
#include <fstream>
#include <cstring>
using namespace std;
unsigned long long puteri(int nr, long long put, int mod)
{
unsigned long long p=1;
for(int i=0; i<put; i++)
p=(p*nr)%mod;
return p;
}
int hs(char c[], int n=2, int m=103333)
{
int l=strlen(c); unsigned long long k=0;
unsigned long long nr=0;
k=puteri(n, l-1, m);
for(int i=0; i<l; i++)
{
nr+=(c[i]*k)%m;
k/=n;
}
return nr;
}
int main()
{
char c[2000000], match[2000000];
memset(c, 0, 2000000);
memset(match, 0, 2000000);
ifstream f("strmatch.in");
f.getline(match, 2000000);
f.getline(c, 2000000);
f.close();
int h1[2], h2[2], nr=0, sol[1000];
h1[0]=hs(match);
h1[1]=hs(match, 3, 103177);
if(true)
{
char mch[2000000];
memset(mch, 0, 2000000);
strncpy(mch, c, strlen(match));
h2[0]=hs(mch);
h2[1]=hs(mch, 3, 103177);
}
int l=strlen(c), lm=strlen(match); unsigned long long put3=puteri(3, lm-1, 103177);
for(int i=0; i<=l-lm; i++)
{
if(h1[0]==h2[0] && h1[1]==h2[1])
{
if(nr<1000)
sol[nr]=i;
nr++;
}
h2[0]=((h2[0]-c[i]*(1<<(lm-1)))*2+c[i+3])%103333;
h2[1]=((h2[1]-c[i]*put3)*3+c[i+3])%103177;
}
ofstream g("strmatch.out");
g<<nr<<endl;
for(int i=0; i<nr; i++)
g<<sol[i]<<' ';
return 0;
}