Cod sursa(job #2265146)

Utilizator axelteoTeodor Dutu axelteo Data 20 octombrie 2018 17:11:12
Problema Potrivirea sirurilor Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <stdio.h>
#include <string.h>
#include <malloc.h>

#define MAX_STR 2000002
#define MAX_APPS 1001

int map[MAX_STR], apps[MAX_APPS];
char pattern[MAX_STR], str[MAX_STR];

int main() {
    FILE *pFileIn = fopen("strmatch.in", "r");
    FILE *pFileOut = fopen("strmatch.out", "w");

    fgets(pattern, MAX_STR, pFileIn);
    fgets(str, MAX_STR, pFileIn);

    int lenStr = strlen(str) - 1;
    int lenPatt = strlen(pattern) - 1;

    if (lenPatt > lenStr) {
        fprintf(pFileOut, "0\n");
        goto return_label;
    }


    int i = 1, j = 0, numApp = 0;

build_prefArray:
    if (i == lenPatt) {
        goto make_KMP;
    }

back_prefArray:
    if (pattern[i] != pattern[j] && j) {
        j = map[j - 1];
        goto back_prefArray;
    }

    if (pattern[i] == pattern[j]) {
        ++j;
    }

    map[i] = j;
    ++i;
    goto build_prefArray;

make_KMP:
    i = 0; j = 0;

KMP_search:
    if (i == lenStr) {
        goto print_matches;
    }

back_on_array:
    if (pattern[j] != str[i] && j) {
        j = map[j - 1];
        goto back_on_array;
    }

    if (str[i] == pattern[j]) {
        ++j;
    }

    if (j == lenPatt) {
        if (numApp < 1000) {
            apps[numApp] = i - lenPatt + 1;
        }

        ++numApp;
        j = map[j - 1];
    }

    ++i;
    goto KMP_search;

print_matches:
    fprintf(pFileOut, "%d\n", numApp);
    numApp = (numApp < 1000 ? numApp : 1000);
    i = 0;

print_apps:
    if (i < numApp) {
        fprintf(pFileOut, "%d ", apps[i]);
        ++i;
        goto print_apps;
    }
    fprintf(pFileOut, "\n");

return_label:
    return 0;
}