Cod sursa(job #467723)

Utilizator gorgovanAurelian Namascu gorgovan Data 30 iunie 2010 00:17:26
Problema Potrivirea sirurilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 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> v;
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<=m-n;i++)
    {
        if(h1a==h1p)
         if(h2a==h2p)
         {v.pb(i);
         }

      h1a= baza*(h1a-pow1*a[i+1])+a[i+m+1];

    }
    fout<<v.size()<<"\n";
    for(int i=0;i<=v.size()-1&&i<=1000;i++)
      fout<<v[i]<<"\n";


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


}
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;
}