Cod sursa(job #2284501)

Utilizator MaraPMara P MaraP Data 17 noiembrie 2018 11:19:08
Problema Potrivirea sirurilor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>
#include <fstream>
#include <string.h>

using namespace std;

struct Hash
{
    int n,m,power,hash;
    void init(char *s, int len)
    {
        power=1,hash=0;
        for(int i=len-1;i>=0;i--)
        {
           hash=(hash+(1LL*power*s[i])%m)%m;
            if(i)
                power=(power*n)%m;
        }
    }
    void roll(char toremove, char toadd)
    {
        hash=(((hash-(1LL*toremove*power)%m+m)*n)%m+toadd)%m;
    }
};
int main()
{
    ifstream fin("strmatch.in");
    ofstream fout("strmatch.out");
    int n,m;
    char p[2000001],t[2000001];
    long long poz[2000001],k=0;
    fin>>p>>t;
    n=strlen(p);
    m=strlen(t);
    Hash pHash{3,666013},tHash{3,666013};
    Hash pHash2{5,765465},tHash2{5,765465};
    pHash.init(p,n);
    tHash.init(t,n);
    pHash2.init(p,n);
    tHash2.init(t,n);
    if(pHash.hash==tHash.hash&&pHash2.hash==tHash2.hash)
    {
        poz[k++]=0;
    }
    for(int i=n;i<m;i++)
    {
        tHash.roll(t[i-n],t[i]);
        tHash2.roll(t[i-n],t[i]);
        if(pHash.hash==tHash.hash&&pHash2.hash==tHash2.hash)
        {
             if(k<=1000)
                poz[k++]=i-n+1;
            else k++;
        }
    }
    if(k>=1000)
        k=1000;
    fout<<k<<"\n";
    for(int i=0;i<k;i++)
        fout<<poz[i]<<" ";
    return 0;
}