Cod sursa(job #1867521)

Utilizator marumatMatei Marussi Alexandru marumat Data 4 februarie 2017 10:33:41
Problema Potrivirea sirurilor Scor 14
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("strmatch.in");
ofstream g("strmatch.out");
#define MOD1 10003
#define MOD2 9973
int m,n,v1,v2,p,r,i,h1,h2,nr,a[1005];
char s1[2000005],s2[2000005],x;
int main()
{
   f.getline(s1,2000005);
   m=strlen(s1);
   f.getline(s2,2000005);
   n=strlen(s2);
   v1=0;
   v2=0;
   for(i=0;i<m;i++)
   {v1=(v1*59+(int)s1[i])%MOD1;
    v2=(v2*61+(int)s1[i])%MOD2;
   }
   p=1; r=1;
   for(i=0;i<m-1;i++)
   {
       p=p*59%MOD1;
       r=r*61%MOD2;
   }
   for(i=0;i<m;i++)
   {
       h1=(h1*59+(int)s2[i])%MOD1;
    h2=(h2*61+(int)s2[i])%MOD2;
   }
   if(v1==h1 && v2==h2){nr++; a[nr]=i-m+1;}
   for(i=m;i<n;i++)
   {
       h1 = ( (h1 - (s2[ i - m]*p)% MOD1 + MOD1)*59 + s2[i])%MOD1;
h2 = ( (h2 - (s2[ i - m]*r)% MOD2 + MOD2)*61 + s2[i])%MOD2;
if (v1==h1 && v2==h2)
    {if(nr<1000)
    {nr++; a[nr]=i+2-m;}
else nr++;}
   }
   g<<nr<<'\n';
   if(nr>1000)nr=1000;
   for(i=1;i<=nr;i++)
   g<<a[i]<<" ";
    return 0;
}