Cod sursa(job #2439520)

Utilizator PopescuDavidPopescu David PopescuDavid Data 16 iulie 2019 10:48:30
Problema Potrivirea sirurilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include<bits/stdc++.h>
#define p1 31
#define p2 101
#define mod1 456231
#define mod2 298145
using namespace std;

ifstream fin("strmatch.in");
ofstream fout("strmatch.out");

char a[2000006],b[2000006];
long long stra,strb;

void citire()
{
    fin>>a>>b;
    stra=strlen(a);
    strb=strlen(b);
}

void solve()
{
    long long hasha1=0,hashb1=0,c=1,hasha2=0,hashb2=0;
    vector<int>sol;
    for(int i=0;i<stra;i++)
    {
        hasha1=hasha1*p+a[i];
        hasha1=hasha1%mod;
        hasha2=hasha2*p+a[i];
        hasha2=hasha2%mod;
        c=c*p%mod;
    }
    for(int i=0;i<stra;i++)
    {
        hashb=hashb*p+b[i];
        hashb=hashb%mod;
    }
    if(hasha==hashb)
    {
        sol.push_back(0);
    }
    for(int i=stra;i<strb;i++)
    {
        hashb=(mod+(hashb*p)%mod-(b[i-stra]*c)%mod+b[i])%mod;
        if(hasha==hashb)
        {
            sol.push_back(i-stra+1);
        }
    }
    fout<<sol.size()<<"\n";
    for(int i=0;i<min(int(sol.size()),1000);i++)
    {
        fout<<sol[i]<<" ";
    }
}

int main()
{
    citire();
    if(stra>strb)
    {
        fout<<0;
        return 0;
    }
    solve();
    return 0;
}