Cod sursa(job #2770095)

Utilizator LucaMihaiLM10Luca Ilie LucaMihaiLM10 Data 19 august 2021 13:04:31
Problema Potrivirea sirurilor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <stdio.h>

#define MAX_N 2000000

int text[MAX_N], pat[MAX_N], lps[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' ) {
        pat[m] = ch;
        m++;
        ch = fgetc( fin );
    }

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

    i = 1;
    j = 0;
    while ( i < m ) {
        if ( pat[i] == pat[j] ) {
            j++;
            lps[i] = j;
            i++;
        } else {
            if ( j == 0 ) {
                lps[i] = 0;
                i++;
            } else
                j = lps[j - 1];
        }
    }

    nrSol = 0;
    i = j = 0;
    while ( i < n ) {
        if ( text[i] == pat[j] ) {
            i++;
            j++;
        }
        if ( j == m ) {
            sol[nrSol] = i - m;
            nrSol++;
            j = lps[j - 1];
        }
        else if ( i < n && text[i] != pat[j] ) {
            if ( j == 0 )
                i++;
            else
                j = lps[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;
}