Cod sursa(job #1400673)

Utilizator metrix007Lungu Ioan Adrian metrix007 Data 25 martie 2015 13:17:52
Problema Potrivirea sirurilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;

char pattern[2000001],str[2000001];
bool sol[2000001];
int nr=0;
int main()
{
    ifstream in("strmatch.in");
    ofstream out("strmatch.out");

    in >> pattern >> str;
    int np=strlen(pattern),ns=strlen(str);
    int hashp1=0,hashp2=0,hash1=0,hash2=0,mod1=666013,mod2=100019,p=73,p1=1,p2=1;
    for(int i=0;i<np;i++)
    {
        hashp1=(hashp1*p+pattern[i])%mod1;
        hashp2=(hashp2*p+pattern[i])%mod2;
        if(i!=0)
        {
            p1=(p1*p)%mod1;
            p2=(p2*p)%mod2;
        }
    }
    for(int i=0;i<np;i++)
    {
        hash1=(hash1*p+str[i])%mod1;
        hash2=(hash2*p+str[i])%mod2;
    }

    if(hash1==hashp1 && hash2==hashp2)
        sol[0]=1,nr++;

    for(int i=np;i<ns;i++)
    {

        hash1=((hash1-(str[i-np]*p1)%mod1+mod1)*p+str[i])%mod1;
        hash2=((hash2-(str[i-np]*p2)%mod2+mod2)*p+str[i])%mod2;
        //cout << hash1 << " " <<hashp1 << endl;

        if(hash1==hashp1 && hash2==hashp2)
        {
            nr++;
            sol[i-np+1]=1;
        }
    }
    out << nr << "\n";
    nr=0;
    for(int i=0;i<2000001 && nr<=1000;i++)
    {
        if(sol[i]) {nr++; out << i << " ";}
    }
}