Cod sursa(job #2196516)

Utilizator AlexandruabcdeDobleaga Alexandru Alexandruabcde Data 19 aprilie 2018 17:05:37
Problema Potrivirea sirurilor Scor 92
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <bits/stdc++.h>
#define Mod1 666013
#define Mod2 10003
using namespace std;
ifstream f ("strmatch.in");
ofstream g ("strmatch.out");
vector <int> sol;
char A[2000005],B[2000005];
int n,m;
int h1,h2,x1,x2,p1,p2;
int main()
{
    f.getline(A,2000002);
    f.getline(B,2000002);
    n = strlen(A);
    m = strlen(B);
    h1 = h2 = 0;
    p1 = p2 = 1;
    for (int i = 0; i < n; i++)
    {
        h1 = ((h1 * 127) % Mod1 + (A[i] - 'A')) % Mod1;
        h2 = ((h2 * 131) % Mod2 + (A[i] - 'A')) % Mod2;
        x1 = ((x1 * 127) % Mod1 + (B[i] - 'A')) % Mod1;
        x2 = ((x2 * 131) % Mod2 + (B[i] - 'A')) % Mod2;
    }
    for (int i = 1; i < n; i++)
    {
        p1 = (p1 * 127) % Mod1;
        p2 = (p2 * 131) % Mod2;
    }
    if (h1 == x1 && h2 == x2)
    {
        sol.push_back(0);
    }

    for (int i = n; i < m; i++)
    {
        x1 = ((x1 - ((B[i - n] - 'A') * p1) % Mod1 + Mod1) * 127 + (B[i] - 'A')) % Mod1;
        x2 = ((x2 - ((B[i - n] - 'A') * p2) % Mod2 + Mod2) * 131 + (B[i] - 'A')) % Mod2;
        if (x1 == h1 && x2 == h2)
        {
            sol.push_back(i-n+1);
        }
    }
    g << sol.size() << '\n';

    for (int i = 0; i < 1000 && i < sol.size(); i++)
        g << sol[i] << " ";
    return 0;
}