Pagini recente » Statistici Stingacianu Vlad (Stingacianu.Vlad) | Statistici Nohai Alexandru (alexnohai04) | Cod sursa (job #307500) | Cod sursa (job #1245295) | Cod sursa (job #1550158)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("strmatch.in");
ofstream fout("strmatch.out");
#define MAXN 2000001
#define P 73
#define MOD1 100007
#define MOD2 100021
char A[MAXN], B[MAXN];
int NA, NB;
int hashA1, hashA2, P1, P2,i,Nr=0;
char match[MAXN];
int main ()
{
freopen("strmatch.in","r",stdin);
freopen("strmatch.out","w",stdout);
NA=strlen(A);
NB=strlen(B);
P1=P2=1;
hashA1=hashA2=0;
if (NA>NB)
fout<<0;
else { for (int i=0;i<NA;i++)
{hashA1=(hashA1*P+A[i])%MOD1;
hashA2=(hashA2*P+A[i])%MOD2;
if (i!=0)
{P1=(P1*P)%MOD1;
P2=(P2*P)%MOD2;}}
int hash1=0,hash2=0;
for (int i=0;i<NA;i++)
{hash1=(hash1*P+B[i])%MOD1;
hash2=(hash2*P+B[i])%MOD2;}
if (hash1==hashA1&&hash2==hashA2)
{match[0]=1;Nr++;}
for (int i = NA; i < NB; i++)
{hash1=((hash1-(B[i-NA]*P1)%MOD1+MOD1)*P+B[i])%MOD1;
hash2=((hash2-(B[i-NA]*P2)%MOD2+MOD2)*P+B[i])%MOD2;}
if (hash1==hashA1&&hash2==hashA2)
{match[i-NA+1]=1;Nr++;}
printf("%d\n", Nr);
Nr=0;
for(int i=0;i<NB&&Nr<1000;i++)
if (match[i])
{Nr++;
fout<<i;}}
return 0;
}