Cod sursa(job #1550158)

Utilizator AdrianFlorinAdrian Florin Stefanescu AdrianFlorin Data 13 decembrie 2015 12:39:55
Problema Potrivirea sirurilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 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 ()
{
 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;
    }