Cod sursa(job #2284533)

Utilizator AntoniuFicAntoniu Ficard AntoniuFic Data 17 noiembrie 2018 11:27:11
Problema Potrivirea sirurilor Scor 14
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <fstream>
#include <cstring>

using namespace std;

unsigned long long puteri(int nr, long long put, int mod)
{
    unsigned long long p=1;
    for(int i=0; i<put; i++)
        p=(p*nr)%mod;
    return p;
}

int hs(char c[], int n=2, int m=100021)
{
    int l=strlen(c); unsigned long long k=0;
    unsigned long long nr=0;
    k=puteri(n, l-1, m);
    for(int i=0; i<l; i++)
    {
        nr+=(c[i]*k)%m;
        k/=n;
    }
    return nr%m;
}

int main()
{
    char c[200000], match[200000];
    memset(c, 0, 200000);
    memset(match, 0, 200000);
    ifstream f("strmatch.in");
    f.getline(match, 200000);
    f.getline(c, 200000);
    f.close();
    int h1[2], h2[2], nr=0, sol[1000];
    h1[0]=hs(match);
    h1[1]=hs(match, 3, 100007);
    if(true)
    {
        char mch[200000];
        memset(mch, 0, 200000);
        strncpy(mch, c, strlen(match));
        h2[0]=hs(mch);
        h2[1]=hs(mch, 3, 100007);
    }
    int l=strlen(c), lm=strlen(match); unsigned long long put3=puteri(3, lm-1, 100007);
    for(int i=0; i<=l-lm; i++)
    {
        if(h1[0]==h2[0] && h1[1]==h2[1])
        {
            if(nr<1000)
                sol[nr]=i;
            nr++;
        }
        h2[0]=((h2[0]-c[i]*(1<<(lm-1)))*2+c[i+3])%100021;
        h2[1]=((h2[1]-c[i]*put3)*3+c[i+3])%100007;
    }
    ofstream g("strmatch.out");
    g<<nr<<endl;
    for(int i=0; i<nr; i++)
        g<<sol[i]<<' ';
    return 0;
}