Cod sursa(job #2284473)

Utilizator MaraPMara P MaraP Data 17 noiembrie 2018 11:10:45
Problema Potrivirea sirurilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 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--)
        {
           hashh=(hashh+(1LL*power*s[i])%m)%m;
            if(i)
                power=(power*n)%m;
        }
    }
    void roll(char toremove, char toadd)
    {
       hashh=(((hashh-(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{31,666013},tHash{31,666013};
    Hash pHash2{53,765465},tHash2{53,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;
}