Cod sursa(job #1748824)

Utilizator moise_alexandruMoise Alexandru moise_alexandru Data 26 august 2016 22:36:49
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream in("strmatch.in");
ofstream out("strmatch.out");
const int mod1 = 666019;
const int mod2 = 666013;
const int baza = 26;
vector <int> sol;
string a, b;
int main()
{
    getline(in, a);
    getline(in, b);
    int m = a.size();
    int n = b.size();
    int nr1 = 0;
    int nr2 = 0;
    for(int i = 0; i < m; i++)
    {
        nr1 = (nr1 * 26 + a[i] + 1) % mod1;
        nr2 = (nr2 * 26 + a[i] + 1) % mod2;
    }
    int q1 = 1;
    int q2 = 1;
    for(int i = 1; i < m; i++)
    {
        q1 = (q1 * 26) % mod1;
        q2 = (q2 * 26) % mod2;
    }
    int act1 = 0;
    int act2 = 0;

    for(int i = 0; i < m; i++)
    {
        act1 = (act1 * 26 + b[i] + 1) % mod1;
        act2 = (act2 * 26 + b[i] + 1) % mod2;
    }
    int rez = 0;
    for(int i = m; i < n; i++)
    {
        if(nr1 == act1 && nr2 == act2)
        {
            sol.push_back(i - m);
            rez++;
        }
        act1 = (act1 - q1 * (b[i - m] + 1) % mod1 + mod1) % mod1;
        act2 = (act2 - q2 * (b[i - m] + 1) % mod2 + mod2) % mod2;
        act1 = (act1 * 26 + b[i] + 1) % mod1;
        act2 = (act2 * 26 + b[i] + 1) % mod2;
    }
    if(nr1 == act1 && nr2 == act2)
    {
        sol.push_back(n - m);
        rez++;
    }
    out << rez << "\n";
    for(int i = 0; i < min((int)sol.size(), 1000); i++)
        out << sol[i] << " ";
    return 0;
}