Mai intai trebuie sa te autentifici.
Cod sursa(job #2807592)
Utilizator | 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;
}