Cod sursa(job #467784)

Utilizator gorgovanAurelian Namascu gorgovan Data 30 iunie 2010 16:28:50
Problema Potrivirea sirurilor Scor 14
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
//rabin karp
using namespace std;
#include<vector>
#include<iostream>
#include<fstream>
#include<cstring>
#define mod1 2000003
#define mod2 666013
#define baza 255
#define pb push_back
#define f(alfa) for(int i=1;i<=alfa;i++)
char a[2000003],p[2000003];
int n,m,h1p,h2p,h1a,h2a,pow1=1,pow2=1;
vector<int> sol;
ofstream fout("strmatch.out");
void solve()
{
    f(m-1)
    {pow1*=baza;
    pow1%=mod1;
    pow2*=baza;
    pow2%=mod2;
    }
    f(m)
    {h1p=h1p*baza+p[i];
    h1p%=mod1;
    h2p=h2p*baza+p[i];
    h2p%=mod2;
    }

    f(m)
    {h1a=h1a*baza+a[i]; h1a%=mod1;
    h2a=h2a*baza+a[i]; h2a%=mod2;
    }

    for(int i=0;i<=n-m;i++)
    {
        if(h1a==h1p)
         if(h2a==h2p)
         {sol.push_back(i);

         }

      h1a= (baza*((h1a-pow1*a[i+1])%mod1+mod1)+a[i+m+1])%mod1;//<=======AI GRIJA LA MODULO
      h2a= (baza*((h2a-pow2*a[i+1])%mod2+mod2)+a[i+m+1])%mod2;

    }

    fout<<0<<"\n";

    //for(unsigned int i=0;(i<=sol.size()-1)&&(i<=999);i++)
     // fout<<sol[i]<<" ";


}
void cit()
{
    ifstream fin("strmatch.in");
    fin.getline(p,2000003);
    fin.getline(a,2000003);
    fin.close();

}
int main()
{int i;
    cit();
    m=strlen(p);
    n=strlen(a);

    for(i=m;i>0;i--) p[i]=p[i-1];
    for(i=n;i>0;i--) a[i]=a[i-1];

    solve();


fout.close();
    return 0;
}