Cod sursa(job #2284565)

Utilizator Mihnea_11Mihnea Lopataru Mihnea_11 Data 17 noiembrie 2018 11:37:53
Problema Potrivirea sirurilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;

char p[2000005];
char t[2000005];

long long rez[1005];
long long l1, l2;

struct Hash
{
    long long n, m, power, hashh;
    void init(char *s, long long len)
    {
        power=1;
        hashh=0;
        for(long long 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 f ("strmatch.in");
    ofstream g ("strmatch.out");

    f >> p >> t;
    l1 = strlen(p);
    l2 = strlen(t);

    Hash pHash{31,40099},tHash{31,40099};
    Hash oHash{53,319993},qHash{53,319993};

    long long nr=0;

    pHash.init(p,l1);
    tHash.init(t,l1);
    oHash.init(p,l1);
    qHash.init(t,l1);

    if(pHash.hashh==tHash.hashh && oHash.hashh == qHash.hashh)
    {
        rez[++nr]=0;
    }

    for(long long i=l1; i<l2; i++)
    {
        tHash.roll(t[i-l1],t[i]);
        qHash.roll(t[i-l1],t[i]);

        if(tHash.hashh == pHash.hashh && oHash.hashh == qHash.hashh)
        {
            if(nr<=1000)
                rez[++nr]=(i-l1+1);
            else nr++;
        }
    }
    g << nr << '\n';
    if(nr>=1000)
        nr=1000;
    for(int i=1; i<=nr; i++)
        g << rez[i] << ' ';
    return 0;
}