Cod sursa(job #1563414)

Utilizator serbanSlincu Serban serban Data 6 ianuarie 2016 00:10:09
Problema Potrivirea sirurilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>
#include <cstring>
#include <vector>

#define key1 100007
#define key2 100037
#define fact 101

using namespace std;

char a[2000005]; int n;
char b[2000005]; int m;
long long hA1, hA2, hB1, hB2, for1 = 1, for2 = 1; int nr;
vector<int> ret;

int main()
{
    ifstream f("strmatch.in");
    ofstream g("strmatch.out");
    f >> a; n = strlen(a);
    f >> b; m = strlen(b);
    if(n > m) {g << "0\n"; return 0;}
    for(int i = 0; i < n; i ++) {
        hA1 = (hA1 * fact + a[i]) % key1;
        hA2 = (hA2 * fact + a[i]) % key2;
        if(i) {
            for1 = for1 * fact % key1;
            for2 = for2 * fact % key2;
        }
    }

    for(int i = 0; i < n; i ++) {
        hB1 = (hB1 * fact + b[i]) % key1;
        hB2 = (hB2 * fact + b[i]) % key2;
    }

    if(hA1 == hB1 && hA2 == hB2) {
        nr ++;
        ret.push_back(0);
    }

    for(int i = n; i < m; i ++) {
        hB1 = ((hB1 - b[i - n] * for1 % key1 + key1) * fact + b[i]) % key1;
        hB2 = ((hB2 - b[i - n] * for2 % key2 + key2) * fact + b[i]) % key2;
        if(hA1 == hB1 && hA2 == hB2) {
            nr ++;
            ret.push_back(i - n + 1);
        }
    }

    g << nr << "\n";
    for(int i = 0; i < ret.size() && i <= 1000; i ++) {
        g << ret[i] << " ";
    }
    g << "\n";
    return 0;
}