Cod sursa(job #2485197)

Utilizator elenaisaiaElena Isaia elenaisaia Data 1 noiembrie 2019 09:51:02
Problema Potrivirea sirurilor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

const int mod1=2000003,mod2=2000029,maxstr=2000005,maxn=1003,baza=256;
int sol[maxn],nr,n,m,hashmic1,hashmic2,hash1,hash2,putere1=1,putere2=1;
char mic[maxstr],mare[maxstr];

void citire()
{
    ifstream fin("strmatch.in");
    fin.getline(mic,maxstr);
    fin.getline(mare,maxstr);
    n=strlen(mic);
    m=strlen(mare);
}

void hashuri()
{
    for(int i=0;i<n;i++)
    {
        hashmic1=(hashmic1*baza+mic[i])%mod1;
        hashmic2=(hashmic2*baza+mic[i])%mod2;
        hash1=(hash1*baza+mare[i])%mod1;
        hash2=(hash2*baza+mare[i])%mod2;
        if(i)
        {
            putere1=(putere1*baza)%mod1;
            putere2=(putere2*baza)%mod2;
        }
    }
}

void rezolvare()
{
    if(hashmic1==hash1&&hashmic2==hash2)
        sol[nr++]=0;
    for(int i=n;i<m;i++)
    {
        hash1=((hash1-putere1*mare[i-n]%mod1+mod1)*baza+mare[i])%mod1;
        hash2=((hash2-putere2*mare[i-n]%mod2+mod2)*baza+mare[i])%mod2;
        if(hashmic1==hash1&&hashmic2==hash2)
            if(nr<1000)
                sol[nr++]=i-n+1;
    }
}

void afisare()
{
    ofstream fout("strmatch.out");
    fout<<nr<<"\n";
    if(nr>1000)
        nr=1000;
    for(int i=0;i<nr;i++)
        fout<<sol[i]<<" ";
}

int main()
{
    citire();
    hashuri();
    rezolvare();
    afisare();
    return 0;
}