Cod sursa(job #2256508)

Utilizator AraldaAralda Pacurar Aralda Data 8 octombrie 2018 18:58:26
Problema Potrivirea sirurilor Scor 22
Compilator c Status done
Runda Arhiva educationala Marime 1.45 kb
#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 < 1000; i++) {

		fprintf(op, "%d ", res[i]);
	}

	fclose(ip);
	fclose(op);

	return 0;
}