Cod sursa(job #1296028)

Utilizator mvcl3Marian Iacob mvcl3 Data 20 decembrie 2014 15:23:29
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <cstdio>
#include <cstring>
#include <vector>

#define Max_Size 2000009
#define Mod1 10007
#define Mod2 666013
#define q 101

using namespace std;

const char iname[] = "strmatch.in";
const char oname[] = "strmatch.out";

char S[Max_Size], P[Max_Size];
vector < int > Sol;

int main()
{
    FILE *in = fopen(iname, "r");
    FILE *out = fopen(oname, "w");

    fscanf(in, "%s%s", &S, &P );

    int N = strlen(S), M = strlen(P), d = 101;

    if(N > M)   {
        fprintf(out, "0\n");
        return 0;
    }

    int HashStr1 = 0, HashStr2 = 0, HashPatt1 = 0, HashPatt2 = 0;

    for(int i = 0 ; i < N; ++i)    {
        HashStr1 = (HashStr1 * q + S[i]) % Mod1;
        HashStr2 = (HashStr2 * q + S[i]) % Mod2;

        HashPatt1 = (HashPatt1 * q + P[i]) % Mod1;
        HashPatt2 = (HashPatt2 * q + P[i]) % Mod2;
    }

    int q1n = 1, q2n = 1;

    for(int i = 1; i < N; ++i) {
        q1n = (q1n * q) % Mod1;
        q2n = (q2n * q) % Mod2;
    }

    if(HashStr1 == HashPatt1 && HashStr2 == HashPatt2)  Sol.push_back(0);

    for(int i = N; i < M; ++i)  {
        HashPatt1 = ((HashPatt1 - (P[i - N] * q1n) % Mod1 + Mod1) * q + P[i]) % Mod1;
        HashPatt2 = ((HashPatt2 - (P[i - N] * q2n) % Mod2 + Mod2) * q + P[i]) % Mod2;

        if(HashStr1 == HashPatt1 && HashStr2 == HashPatt2)  Sol.push_back(i - N + 1);
    }

    fprintf(out, "%d\n", Sol.size());
    for(int i = 0; i < (Sol.size() <= 1000 ? Sol.size() : 1000); ++i)  fprintf(out, "%d ", Sol[i]);

    return 0;
}