Cod sursa(job #2703729)

Utilizator marcumihaiMarcu Mihai marcumihai Data 9 februarie 2021 10:00:29
Problema Potrivirea sirurilor Scor 14
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <bits/stdc++.h>
#define MOD1 100007
#define MOD2 100021


using namespace std;
ifstream f ("strmatch.in");
ofstream g ("strmatch.out");

char s[2000000];
char a[2000000];
int HASH1a,HASH2a;
int hash1s,hash2s;
int n,m;
int match[100005];
int cont;
const int baza=73;
int p1=1,p2=1;
int main()
{
    f>>a;
    f>>s;
    int n=strlen(s);
    int m=strlen(a);
    for(int i=0; i<m; ++i)
    {
        hash1s*=baza;
        hash2s*=baza;
        hash1s+=a[i];
        hash2s+=a[i];
        hash1s=hash1s%MOD1;
        hash2s=hash2s%MOD2;
        if(i!=0)
        {
            p1*=baza;
            p1=p1%MOD1;
            p2*=baza;
            p2=p2%MOD1;
        }

    }
    cout<<hash1s<<" "<<hash2s<<"\n";
    for(int i=0; i<m; ++i)
    {
        HASH1a*=baza;
        HASH2a*=baza;
        HASH1a+=s[i];
        HASH2a+=s[i];
        HASH1a=HASH1a%MOD1;
        HASH2a=HASH2a%MOD2;



    }

     if(hash1s==HASH1a && hash2s==HASH2a)
        {
            match[0]=1;
            ++cont;
        }

    for(int i=m; i<n; ++i)
    {
        cout<<HASH1a<<" "<<HASH2a<<"\n";
        HASH1a = ((HASH1a - (s[i-m] * p1) % MOD1+ MOD1)* baza + s[i]) % MOD1;
        HASH2a = ((HASH2a - (s[i-m] * p2) % MOD2 + MOD2) * baza + s[i]) % MOD2;

        if (HASH1a == hash1s && HASH2a == hash2s)
            match[ i - m + 1 ] = 1, cont++;
    }
    g<<cont<<"\n";
    for(int i=1; i<=n; ++i)
        if(match[i])
            g<<i<<" ";
    return 0;
}