Cod sursa(job #1282539)

Utilizator romircea2010FMI Trifan Mircea Mihai romircea2010 Data 4 decembrie 2014 14:06:10
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>

using namespace std;

const int MOD1 = 666013, MOD2 = 666019;
const int X1 = 7, X2 = 13;
const int NMax = 2000010;
char A[NMax], B[NMax];
vector <int> ans;

void Read()
{
    ifstream f ("strmatch.in");
    f >> A;
    f >> B;
    f.close();
}

void Solve()
{
    int code1 = 0, code2 = 0, now1 = 0, now2 = 0;
    int max1 = 1, max2 = 1;
    int N = strlen(A), M = strlen(B);
    for (int i = 1; i < N; ++ i)
        max1 = (max1 * X1) % MOD1,
        max2 = (max2 * X2) % MOD2;
    for (int i = 0; i < N; ++ i)
        code1 = (code1 * X1 + A[i]) % MOD1,
        code2 = (code2 * X2 + A[i]) % MOD2;
    for (int i = 0; i < N; ++ i)
        now1 = (now1 * X1 + B[i]) % MOD1,
        now2 = (now2 * X2 + B[i]) % MOD2;
    if (now1 == code1 && now2 == code2)
        ans.push_back(0);
    for (int i = N; i < M; ++ i)
    {
        now1 -= (max1 * B[i-N]) % MOD1;
        now2 -= (max2 * B[i-N]) % MOD2;
        if (now1 < 0) now1 += MOD1;
        if (now2 < 0) now2 += MOD2;
        now1 = (now1 * X1 + B[i]) % MOD1;
        now2 = (now2 * X2 + B[i]) % MOD2;
        if (now1 == code1 && now2 == code2)
            ans.push_back(i - N + 1);
    }
}

void Write()
{
    ofstream g ("strmatch.out");
    g << (int)ans.size() << "\n";
    for (int i = 0; i < min(1000, (int)ans.size()); ++ i)
        g << ans[i] << " ";
    g << "\n";
    g.close();
}

int main()
{
    Read();
    Solve();
    Write();
    return 0;
}