Pagini recente » Cod sursa (job #433623) | Cod sursa (job #1845050) | Cod sursa (job #2185829) | Istoria paginii runda/antr2 | Cod sursa (job #2256506)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char pattern[2000001];
char text[2000001];
char lps[2000001];
void get_lps() {
int n = strlen(pattern);
int j = 0;
int i = 1;
lps[0] = 0;
while (i < n) {
if (pattern[i] == pattern[j]) {
lps[i] = j + 1;
j++;
i++;
}
else {
if (!j) {
lps[i] = 0;
i++;
}
else {
j = lps[j - 1];
}
}
}
}
void KMP(int res[], int* size) {
int n = strlen(text);
int m = strlen(pattern);
int i = 0;
int j = 0;
get_lps();
while (i < n) {
if (text[i] == pattern[j]) {
i++;
j++;
}
if (j == m) {
if (*size < 1000) {
res[*size] = i - m;
}
(*size)++;
j = lps[j - 1];
}
else {
if (i < n && text[i] != pattern[j]) {
if (!j) {
i++;
}
else {
j = lps[j - 1];
}
}
}
}
}
int main() {
int res[1000];
int res_size = 0;
FILE* ip = fopen("strmatch.in", "r");
if (!ip) {
perror("cannot open input file");
exit(1);
}
FILE* op = fopen("strmatch.out", "w");
if (!op) {
perror("cannot open output file");
exit(1);
}
fscanf(ip, "%s", pattern);
fscanf(ip, "%s", text);
KMP(res, &res_size);
fprintf(op, "%d\n", res_size);
for (int i = 0; i < res_size; i++) {
fprintf(op, "%d ", res[i]);
}
fclose(ip);
fclose(op);
return 0;
}