Cod sursa(job #820618)

Utilizator gabipurcaruGabi Purcaru gabipurcaru Data 21 noiembrie 2012 08:23:08
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <fstream>
#include <cstring>
#include <vector>
using namespace std;

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

const int M1 = 666013, M2 = 100003, MAXL = 2000010, B = 257;

char c[MAXL],s[MAXL];
int n,i,j,m;
int hc1,hs1,hc2,hs2,q1,q2;
vector<int> sol;

int main() {
    in>>c>>s;
    m = strlen(s);
    n = strlen(c);
    q1 = q2 = 1;
    for(i=0; i<n; i++) {
                hc1 = (hc1 * B + c[i]) % M1;
                hc2 = (hc2 * B + c[i]) % M2;
        }

    for(i=0; i<n-1; i++)
        q1 = (q1*B)%M1, q2 = (q2*B)%M2;

    for(i=0; i<n; i++)
        hs1 = (hs1 * B + s[i]) % M1,
            hs2 = (hs2 * B + s[i]) % M2;
    if(hc1 == hs1 && hc2 == hs2)
        sol.push_back(0);

    for(i=n; i<m; i++) {
        hs1 = ((((hs1 - (q1 * s[i - n])%M1 + 3*M1)%M1)*B)%M1 + s[i]) % M1;
        hs2 = ((((hs2 - (q2 * s[i - n])%M2 + 3*M2)%M2)*B)%M2 + s[i]) % M2;
        if(hc1 == hs1 && hc2 == hs2)
            sol.push_back(i-n+1);
    }
    out<<sol.size()<<'\n';
    for(i=0; i<min((int)sol.size(), 1000); i++)
        out<<sol[i]<<' ';
    return 0;
}