Cod sursa(job #2794528)

Utilizator DajaMihaiDaja Mihai DajaMihai Data 5 noiembrie 2021 01:03:23
Problema Potrivirea sirurilor Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <cstdio>
#include <cstring>
#define MAX 2000000

using namespace std;

char strA [MAX], strB[MAX];
int i, Hash, fHash, j, cntPoz, check;
int Poz [1000];

int addHash (char c, int var){
    return var + (int) c;
}

int removeHash (char c, int var){
    return var - (int) c;
}

int checkString (int a, int h){
    int l;
    l = 0;
    while (l <= h){
        if (strB[a + l - 1] != strA [l])
            return 1;
        l ++;
    }
    return 0;
}


int main() {

    FILE *in, *out;
    in = fopen("strmatch.in", "r");
    out = fopen("strmatch.out", "w");

    i --;
    while (strA[i] != '\n'){
        check = fgetc(in);
        strA [++i] = check;
        Hash = addHash (strA[i], Hash);
    }
    Hash -= 10;
    i --;
    for (j = 0; j <= i; j ++){
        strB [j] = fgetc (in);
        fHash = addHash (strB [j], fHash);
    }

    int LastPos = 0;

    while ((strB[j - 1] >= 'A' && strB[j - 1] <= 'Z')||(strB[j - 1] >= 'a' && strB[j - 1] <= 'z')){
        if (fHash == Hash ){
            if (!checkString(j - i, i)) { Poz[cntPoz] = LastPos; cntPoz ++;}
        }
        fHash = removeHash (strB[j - i - 1], fHash);
        strB [j] = fgetc (in);
        j ++;
        fHash = addHash (strB[j - 1], fHash);
        LastPos ++;
    }
    fprintf (out, "%d\n", cntPoz);
    for (int k = 0; k < cntPoz; k ++)
        fprintf (out, "%d ", Poz[k]);
    return 0;
}