Cod sursa(job #2084427)

Utilizator doruliqueDoru MODRISAN dorulique Data 9 decembrie 2017 07:38:23
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <cstdio>
#include <cstring>

char a[2000010],b[2000010];
int pbase1=2000003,pbase2=2000029,match[1010];

int main()
{
    FILE *f=fopen("strmatch.in","r");
    fgets(a,2000010,f);
    fgets(b,2000010,f);
    int n=strlen(a),m=strlen(b);
    if(a[n-1]=='\n')a[--n]=0;
    if(b[m-1]=='\n')b[--m]=0;
    int i,ha1=0,ha2=0,hb1=0,hb2=0,p256_1=1,p256_2=1;
    for(i=0; a[i]; ++i)
    {
        p256_1=p256_1*256%pbase1;
        ha1=(ha1*256+a[i])%pbase1;
        hb1=(hb1*256+b[i])%pbase1;
        p256_2=p256_2*256%pbase2;
        ha2=(ha2*256+a[i])%pbase2;
        hb2=(hb2*256+b[i])%pbase2;
    }
    int ok,j,nrap=0,q=m-n;
    for(i=0; i<=q; ++i)
    {
        if(ha1==hb1&&ha2==hb2)
        {
            nrap++;
            if(nrap<=1000)match[nrap]=i;
        }
        hb1=((hb1*256-b[i]*p256_1+b[i+n])%pbase1+pbase1)%pbase1;
        hb2=((hb2*256-b[i]*p256_2+b[i+n])%pbase2+pbase2)%pbase2;
    }
    f=fopen("strmatch.out","w");
    fprintf(f,"%d\n",nrap);
    if(nrap>1000)nrap=1000;
    for(i=1; i<=nrap; ++i)fprintf(f,"%d ",match[i]);
    return 0;
}