Cod sursa(job #812692)

Utilizator gabipurcaruGabi Purcaru gabipurcaru Data 14 noiembrie 2012 11:24:44
Problema Potrivirea sirurilor Scor 14
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 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;

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

inline int w(char c) {
    if(c >= '0' && c <= '9')
        return c - '0';
    if(c >= 'a' && c <= 'z')
        return c - 'a';
    return c - 'A' + 10;
}

int main() {
    in>>c>>s;
    q1 = q2 = 1;
    for(i=0; i<strlen(c); i++)
        hc1 = (hc1 * 46 + w(c[i])) % M1, q1 = (q1*46)%M1,
           hc2 = (hc2 * 46 + w(c[i])) % M2, q2 = (q2*46)%M2;
    q1 /= 46;
    q2 /= 46;
    for(i=0; i<strlen(c); i++)
        hs1 = (hs1 * 46 + w(s[i])) % M1,
            hs2 = (hs2 * 46 + w(s[i])) % M2;
    if(hc1 == hs1 && hc2 == hs2)
        sol.push_back(0);

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