Cod sursa(job #2638071)

Utilizator etienAndrone Stefan etien Data 26 iulie 2020 18:22:07
Problema Potrivirea sirurilor Scor 32
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include<bits/stdc++.h>
using namespace std;
ifstream fin("strmatch.in");
ofstream fout("strmatch.out");
vector<int>poz;
const int MOD=666013;
int hsh(string s)
{
    int mod=0,val=1;
    for(int poz=(int)s.size()-1;poz>=0;poz--)
    {
        mod+=(val%MOD)*(s[poz]-'A');
        val*=26;
        val%=MOD;
        mod%=MOD;
    }
    return mod;
}
int main()
{
    string a,b;
    fin>>a>>b;
    int nr=0,hsa=hsh(a);
    string s=b.substr(0,a.size());
    int hsb=hsh(s);
    int put=1;
    for(int i=1;i<=(int)a.size();i++)
    {
        put*=26;
        put%=MOD;
        //cout<<put<<" ";
    }
    //cout<<hsa<<"\n";
    for(int i=a.size();i<(int)b.size();i++)
    {
        if(hsa==hsb)
        {
            nr++;
            poz.push_back(i);
        }
        //cout<<hsb<<" ";
        hsb*=26;
        hsb+=b[i]-'A';
        hsb-=(put*(b[i-a.size()]-'A'))%MOD;
        if(hsb<0)
            hsb+=MOD;
        hsb%=MOD;
    }
    if(hsa==hsb)
    {
        nr++;
        poz.push_back(b.size());
    }
    fout<<nr<<"\n";
    for(auto p:poz)
        fout<<p-a.size()<<" ";
}