Cod sursa(job #2388090)

Utilizator alisavaAlin Sava alisava Data 25 martie 2019 17:35:55
Problema Potrivirea sirurilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <bits/stdc++.h>
#define Mod1 916027951
#define Mod2 144667717
#define NrC 127

using namespace std;

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

char s[2000005], c[2000005];
long long val1, val2;
long long verif1, verif2;
long long p1, p2;
int k, n;
int raspuns[2000000], top = 0;

int main()
{
    fin >> (c + 1);
    k = strlen(c + 1);
    fin >> (s + 1);
    n = strlen(s + 1);
    p1 = p2 = 1;
    for(int i = 1; i <= k; i++)
    {
        val1 = (val1 * NrC + c[i]) % Mod1;
        val2 = (val2 * NrC + c[i]) % Mod2;
        verif1 = (verif1 * NrC + s[i]) % Mod1;
        verif2 = (verif2 * NrC + s[i]) % Mod2;

        if(i == 1) continue;

        p1 = (p1 * NrC) % Mod1;
        p2 = (p2 * NrC) % Mod2;
    }
    if(val1 == verif1 && val2 == verif2)
        raspuns[++top] = 0;
    for(int i = k + 1; i <= n; i++)
    {
        verif1 = (verif1 - (s[i - k] * p1 % Mod1) + Mod1) % Mod1;
        verif1 = (verif1 * NrC + s[i]) % Mod1;
        verif2 = (verif2 - (s[i - k] * p2 % Mod2) + Mod2) % Mod2;
        verif2 = (verif2 * NrC + s[i]) % Mod2;
        if(val1 == verif1 && val2 == verif2)
            raspuns[++top] = i - k;
    }
    fout << top << "\n";
    for(int i = 1; i <= min(1000,top); i++)
    {
        cout << i << " " << raspuns[i] <<"\n";
        fout << raspuns[i] << " ";
    }
    return 0;
}