Cod sursa(job #2977179)

Utilizator biancalautaruBianca Lautaru biancalautaru Data 10 februarie 2023 23:54:06
Problema Potrivirea sirurilor Scor 14
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.98 kb
#include <fstream>
#include <cstring>
#define DIM 2000005
#define mod 1999733
#define baza 73
using namespace std;
ifstream fin("strmatch.in");
ofstream fout("strmatch.out");
long long n,m,h1,h2,cnt,p[DIM],sol[DIM];
char a[DIM],b[DIM];

bool verif(char a[],char b[],int p) {
    for (int i=1;i<=n;i++)
        if (a[i]!=b[p+i-1])
            return 0;
    return 1;
}

int main() {
    fin>>(a+1)>>(b+1);
    n=strlen(a+1);
    m=strlen(b+1);
    if (n>m) {
        fout<<0;
        return 0;
    }
    p[1]=1;
    for (int i=2;i<=n;i++)
        p[i]=(p[i-1]*baza)%mod;
    for (int i=1;i<=n;i++) {
        h1=(h1+a[i]*p[n-i+1])%mod;
        h2=(h2+b[i]*p[n-i+1])%mod;
    }
    if (h1==h2)
        sol[++cnt]=0;
    for (int i=n+1;i<=m;i++) {
        h2=(((h2-b[i-n]*p[n])%mod+mod)*baza+b[i])%mod;
        if (h1==h2 && verif(a,b,i-n+1))
            sol[++cnt]=i-n;
    }
    for (int i=1;i<=cnt && i<=1000;i++)
        fout<<sol[i]<<" ";
    return 0;
}