Cod sursa(job #3176898)

Utilizator paull122Paul Ion paull122 Data 27 noiembrie 2023 23:28:47
Problema Potrivirea sirurilor Scor 14
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.94 kb
#include <bits/stdc++.h>

using namespace std;
typedef long long int ll;
#define MOD 666013

#define HBASE1 73
#define HBASE2 73
#define HSIZE1 100021
#define HSIZE2 100007

ifstream fin("strmatch.in");
ofstream fout("strmatch.out");


int pwr(int a,int b,int mod)
{
    if(b==0)return 1;
    int p = pwr(a,b/2,mod)%mod;
    if(b%2)
    {
        return p*p*a%mod;
    }
    return p*p%mod;
}


int gethash(char *s,int len,int base,int hsize)
{
    int hval=0;
    for(int i=0;i<len;i++)
    {
        hval = (hval * base + s[i])%hsize;
    }
    return hval;
}

bool cmp(char *a , char *b)
{
    int i=0;
    while(i<strlen(a) && a[i]==b[i])
    {
        i++;
    }
    return i==strlen(a);
}

int addhash(int val,char c,int base,int hsize)
{
    val = (val * base + c)%hsize;
    return val;
}
int removehash(int val,char c,int put,int hsize)
{
    val -= c*put %hsize;
    if(val < 0)
    {
        val += hsize;
    }
    return val;
}
char a[2000001];
char b[2000001];
int main()
{
    fin >> a >> b;
    vector<int> r;
    int len = strlen(a);
    int put1= pwr(HBASE1,len-1,HSIZE1);
    int put2 = pwr(HBASE2,len-1,HSIZE2);


    int pathash1 = gethash(a,len,HBASE1,HSIZE1);
    int pathash2 = gethash(a,len,HBASE2,HSIZE2);

    int currhash1 = gethash(b,len-1,HBASE1,HSIZE1);
    int currhash2 = gethash(b,len-1,HBASE2,HSIZE2);
    int i = len;
    while(i<=strlen(b))
    {
        currhash1 = addhash(currhash1,b[i-1],HBASE1,HSIZE1);
        currhash2 = addhash(currhash2,b[i-1],HBASE2,HSIZE2);
        if(currhash1 == pathash1 && currhash2 == pathash2)
        {
            r.push_back(i-len);
        }
        currhash1 = removehash(currhash1,b[i-len],put1,HSIZE1);
        currhash2 = removehash(currhash2,b[i-len],put2,HSIZE2);
        i++;
    }
    int n=r.size();
    fout << n << "\n";
    for(int i=0;i<min(n,1000);i++)
    {
        fout << r[i] << " ";
    }
}