Cod sursa(job #2088991)

Utilizator vlad_schillerSchiller Vlad Radu vlad_schiller Data 16 decembrie 2017 10:04:33
Problema Potrivirea sirurilor Scor 14
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <cstdio>
#include <cstring>
#define n1 2000003
#define n2 2000029
using namespace std;
char p[2000010],s[2000010];
int n,m,p256n1,p256n2,h1p,h2p,h1s,h2s,match,poz[1000];

int calcul_h(char *p,int &h1p, int &h2p,int &p256n1,int &p256n2)
{
    int i;
    p256n1=1;
    p256n2=1;
    for(i=0;i<n;++i)
    {
        p256n1=(p256n1*256)%n1;
        p256n2=(p256n2*256)%n2;
        h1p=(h1p*256+p[i])%n1;
        h2p=(h2p*256+p[i])%n2;
    }
}
FILE *f=fopen("strmatch.in","r");
int main()
{
    int i;
    fgets(p,2000010,f);
    n=strlen(p);
    if(p[n-1]=='\n')
        p[n-1]=0;
    fgets(s,2000010,f);
    m=strlen(s);
    if(s[m-1]=='\n')
        s[m-1]=0;
    strcpy(p,"abc");
    calcul_h(p,h1p,h2p,p256n1,p256n2);
    calcul_h(s,h1s,h2s,p256n1,p256n2);
    for(i=n-1;i<m;++i)
    {
        if(h1p==h2p&&h1s==h2s)
        {
            match++;
            if(match<=1000)
                poz[match]=i+1-n;
        }
        h1s=(h1s*256)%n1-(s[i+1-n]*p256n1)%n1+s[i+1]%n1;
        h1s=(n1+h1s)%n1;
        h2s=(h2s*256)%n2-(s[i+1-n]*p256n2)%n2+s[i+1]%n2;
        h1s=(n2+h2s)%n2;
    }
    fclose(f);
    f=fopen("strmatch.out","w");
    fprintf(f,"%d\n",match);
    if(match>1000)match=1000;
    for(i=0;i<match;++i)
        fprintf(f,"%d ",poz[i]);
    return 0;
}