Cod sursa(job #2770076)

Utilizator LucaMihaiLM10Luca Ilie LucaMihaiLM10 Data 19 august 2021 12:21:37
Problema Potrivirea sirurilor Scor 14
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <stdio.h>

#define MAX_N 2000000

int text[MAX_N], pattern[MAX_N], prefix[MAX_N], sol[MAX_N];

int main() {
    FILE *fin, *fout;
    char ch;
    int n, m, nrSol, i, j;
    fin = fopen( "strmatch.in", "r" );

    ch = fgetc( fin );
    m = 0;
    while ( ch != '\n' ) {
        pattern[m] = ch;
        m++;
        ch = fgetc( fin );
    }

    ch = fgetc( fin );
    n = 0;
    while ( ch != '\n' ) {
        text[n] = ch;
        n++;
        ch = fgetc( fin );
    }

    prefix[0] = 1;
    i = 0;
    for ( j = 1; j < m; j++ ) {
        if ( pattern[i] == pattern[j] ) {
            prefix[j] = prefix[j - 1] + 1;
            i++;
        } else {
            prefix[j] = 0;
            i = 0;
        }
    }

    nrSol = 0;
    j = 0;
    for ( i = 0; i < n; i++ ) {
        if ( text[i] == pattern[j] ) {
            j++;
            if ( j == m ) {
                sol[nrSol] = i - m + 1;
                nrSol++;
                j = prefix[j - 1];
            }
        } else
            j = (j == 0 ? 0 : prefix[j - 1]);
    }

    fout = fopen( "strmatch.out", "w" );
    fprintf( fout, "%d\n", nrSol );
    for ( i = 0; i < nrSol; i++ )
        fprintf( fout, "%d ", sol[i] );
    fclose( fout );

    return 0;
}