Cod sursa(job #2284398)

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

using namespace std;

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

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

int main()
{
    char c[2000000], match[2000000];
    memset(c, 0, 2000000);
    memset(match, 0, 2000000);
    ifstream f("strmatch.in");
    f.getline(match, 2000000);
    f.getline(c, 2000000);
    f.close();
    int h1[2], h2[2], nr=0, sol[1000];
    h1[0]=hs(match);
    h1[1]=hs(match, 3, 103177);
    if(true)
    {
        char mch[2000000];
        memset(mch, 0, 2000000);
        strncpy(mch, c, strlen(match));
        h2[0]=hs(mch);
        h2[1]=hs(mch, 3, 103177);
    }
    int l=strlen(c), lm=strlen(match), put3=puteri(3, lm-1);
    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])%103333;
        h2[1]=((h2[1]-c[i]*put3)*3+c[i+3])%103177;
    }
    ofstream g("strmatch.out");
    g<<nr<<endl;
    for(int i=0; i<nr; i++)
        g<<sol[i]<<' ';
    return 0;
}