Cod sursa(job #1550151)

Utilizator AdrianFlorinAdrian Florin Stefanescu AdrianFlorin Data 13 decembrie 2015 12:26:35
Problema Potrivirea sirurilor Scor 14
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb

#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 ()
{
    fin.getline(A,2000000);
    fin.getline(B,2000000);
    NA=strlen(A);
    NB=strlen(B);
    P1=P2=1;
    hashA1=hashA2=0;
    if (NA>NB)
    {
        fout<<0;
        return 0;
    }
    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++;}
       fout<<Nr;
       fout<<endl;
       Nr=0;
    for (int i=0;i<NB&&Nr<1000;i++)
        if (match[i])
            {Nr++;
           fout<<i;
  fout<<endl;}
return 0;
    }