Pagini recente » Cod sursa (job #2433007) | Cod sursa (job #1056411) | Cod sursa (job #1168383) | Cod sursa (job #2923229) | Cod sursa (job #2265146)
#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;
}