Cod sursa(job #3264565)

Utilizator vladm98Munteanu Vlad vladm98 Data 22 decembrie 2024 14:24:06
Problema Potrivirea sirurilor Scor 14
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <fstream>
#include <vector>
using namespace std;

ifstream cin("strmatch.in");
ofstream cout("strmatch.out");

#define int long long
#define B 31
#define MOD 1000000007
#define B2 37
#define MOD2 666013

int put[2000001];
int put2[2000001];
vector<int> rasp;

signed main()
{
    string s,s1;
    cin>>s>>s1;
    int i,hashm,hashc,cnt=0,hashm2,hashc2;
    put[0]=1;
    put2[0]=1;
    for(i=1;i<=2000000;i++){
        put[i]=(put[i-1]*B)%MOD;
        put2[i]=(put2[i-1]*B2)%MOD2;
    }
    hashm=hashc=0;
    hashm2=hashc2=0;
    for(i=0;i<s.size();i++){
        hashm=(hashm*B+s[i])%MOD;
        hashm2=(hashm2*B2+s[i])%MOD2;
    }

    for(i=0;i<s.size();i++){
        hashc=(hashc*B+s1[i])%MOD;
        hashc2=(hashc2*B2+s1[i])%MOD2;
    }
    if(hashc==hashm and hashc2==hashm2){
        cnt++;rasp.push_back(0);
    }
    for(int i=1;i<=((int) s1.size())-(int) s.size();i++){
        hashc=(MOD+hashc-(put[s.size()-1]*1ll*(s1[i-1]))%MOD)%MOD;
        hashc=(MOD+hashc-(put[s.size()-1]*1ll*(s1[i-1]))%MOD)%MOD;
        hashc2=(MOD2+hashc2-(put2[s.size()-1]*1ll*(s1[i-1]))%MOD2)%MOD2;
        if(hashc<0) hashc+=MOD;
        if(hashc2<0) hashc2+=MOD2;
        hashc=(hashc*B+1ll*(s1[i+s.size()-1]))%MOD;
        hashc2=(hashc2*B2+1ll*(s1[i+s.size()-1]))%MOD2;

        if(hashc==hashm and hashc2==hashm2){
            if(cnt<=1000) rasp.push_back(i);
            cnt++;
        }
    }
    cout<<cnt<<"\n";
    for(i=0;i<rasp.size();i++) cout<<rasp[i]<<" ";
    return 0;
}