Mai intai trebuie sa te autentifici.

Cod sursa(job #2807592)

Utilizator TeodorMarciucMarciuc Teodor TeodorMarciuc Data 23 noiembrie 2021 22:59:07
Problema Potrivirea sirurilor Scor 14
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<cstring>
#include<map>
using namespace std;
long long i,j,k,l,m,p,x,n,hashA1,hashA2,hashB1,hashB2,P1,P2,cnt;
#define MOD1 100007
#define MOD2 100013
#define P 73
map<char,long long>Map;
char A[20000005],B[20000005];
int main()
{
    ifstream cin("strmatch.in");
    ofstream cout("strmatch.out");
    cin>>A;
    cin>>B;
    P1=P2=1;
    for(i=97,j=0;i<=122;i++,j++)
    {
        char ch=(char)(i);
        Map[ch]=j;
    }
    for(i=65;i<=90;i++,j++)
        {
        char ch=(char)(i);
        Map[ch]=j;
    }
    for(i=48;i<=57;i++,j++)
    {
        char ch=(char)(i);
        Map[ch]=j;
    }
    for(i=0;i<strlen(A);i++)
    {
        hashA1=(hashA1*P+Map[A[i]])%MOD1;
        hashA2=(hashA2*P+Map[A[i]])%MOD2;
        if(i){
        P1=(P1*P)%MOD1;
        P2=(P2*P)%MOD2;
        }
    }
    for(i=0;i<strlen(A);i++)
    {
        hashB1=(hashB1*P+Map[B[i]])%MOD1;
        hashB2=(hashB2*P+Map[B[i]])%MOD2;
    }
    if(hashA1==hashB1 and hashA2==hashB2)
    cnt++;
    for(i=strlen(A);i<strlen(B);i++)
    {
        hashB1 = ((hashB1 - (B[i - strlen(A)] * P1) % MOD1 +MOD1) * P + Map[B[i]]) % MOD1;
        hashB2 = ((hashB2 - (B[i - strlen(A)] * P2) % MOD2 +MOD2) * P + Map[B[i]]) % MOD2;
        cout<<hashA1<<" "<<hashB1<<'\n';
        if(hashA1==hashB1 and hashA2==hashB2)
        cnt++;
    }
cout<<cnt;
}