Cod sursa(job #2457961)

Utilizator FrostfireMagirescu Tudor Frostfire Data 19 septembrie 2019 10:43:03
Problema Potrivirea sirurilor Scor 72
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <vector>
#define NMAX 2000000
#define MOD1 666013
#define MOD2 666019

using namespace std;

ifstream f("strmatch.in");
ofstream g("strmatch.out");

long long l1, l2;
long long put27_1=1, put27_2=1, nr1_1, nr1_2, nr2_1, nr2_2;
char s1[NMAX+10], s2[NMAX+10];
vector <int> sol;

int main()
{
    f >> s1 >> s2;
    l1 = strlen(s1), l2 = strlen(s2);
    for(int i=1; i<l1; i++)
        {   put27_1 = ((long long)put27_1 * 27) % MOD1;
            put27_2 = ((long long)put27_2 * 27) % MOD2;
        }
    for(int i=0; i<l1; i++)
        {   nr1_1 = ((long long)nr1_1 * 27 + (s1[i] - 'A' + 1)) % MOD1;
            nr1_2 = ((long long)nr1_2 * 27 + (s1[i] - 'A' + 1)) % MOD2;
        }
    for(int i=0; i<l1; i++)
        {   nr2_1 = ((long long)nr2_1 * 27 + (s2[i] - 'A' + 1)) % MOD1;
            nr2_2 = ((long long)nr2_2 * 27 + (s2[i] - 'A' + 1)) % MOD2;
        }
    if(nr1_1 == nr2_1 && nr1_2 == nr2_2)
        sol.push_back(0);

    for(int i=l1; i<l2; i++)
        {   nr2_1 = ((((long long)nr2_1 - put27_1 * (s2[i-l1] - 'A' + 1)) % MOD1 + MOD1) * 27 + s2[i] - 'A' + 1) % MOD1;
            nr2_2 = ((((long long)nr2_2 - put27_2 * (s2[i-l1] - 'A' + 1)) % MOD2 + MOD2) * 27 + s2[i] - 'A' + 1) % MOD2;
            if(nr1_1 == nr2_1 && nr1_2 == nr2_2) sol.push_back(i-l1+1);
        }
    g << sol.size() << '\n';
    int len = sol.size();
    for(int i=0; i<min(1000, len); i++) g << sol[i] << ' ';
    g << '\n';
    return 0;
}