Cod sursa(job #2035188)

Utilizator tudormaximTudor Maxim tudormaxim Data 9 octombrie 2017 00:59:01
Problema Potrivirea sirurilor Scor 12
Compilator c Status done
Runda Arhiva educationala Marime 1.05 kb
// KMP.cpp : Defines the entry point for the console application.
//

#include <stdio.h>
#include <string.h>
#define maxn 2000001

int Pi[maxn], Ans[maxn], size, m, n;
char Pattern[maxn], String[maxn];

void Prefix() {
	int x = -1, i;
	for (i = 1; i < m; i++) {
		if (x > -1 && Pattern[x + 1] != Pattern[i]) x = Pi[x];
		if (Pattern[x + 1] == Pattern[i]) x++;
		Pi[i] = x;
	}
}

void KMP() {
	Prefix();
	int i, x = -1;
	for (i = 0; i < n; i++) {
		while (x > -1 && Pattern[x + 1] != String[i]) x = Pi[x];
		if (Pattern[x + 1] == String[i]) x++;
		if (x == m - 1) {
			Ans[size++] = i - m + 1;
			x = Pi[x];
		}
	}
}

int main() {
	FILE *fin = fopen("strmatch.in", "r");
	FILE *fout = fopen("strmatch.out", "w");
	int i;
	fscanf(fin, "%s", Pattern);
	fscanf(fin, "%s", String);
	m = strlen(Pattern);
	n = strlen(String);
	KMP();
	fprintf(fout, "%d\n", size);
	size = size > 1000 ? 1000 : size;
	for (i = 0; i < size; i++) {
		fprintf(fout, "%d ", Ans[i]);
	}
	fprintf(fout, "\n");
	fclose(fin);
	fclose(fout);
    return 0;
}