Cod sursa(job #2456772)

Utilizator UnDragosDragos Ioana UnDragos Data 15 septembrie 2019 14:13:32
Problema Potrivirea sirurilor Scor 34
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#define lMax 1000000
int N, M;
int pos[1001], prefix[lMax];
void read_data(char** string, char** text, const char* filename)
{
	FILE* fp = fopen(filename, "r");
	char buffer[lMax];
	fgets(buffer, lMax, fp);
	N = strlen(buffer)-1;
	(*string) = new char[N];
	strcpy((*string)+1, buffer);
	fgets(buffer, lMax, fp);
	M = strlen(buffer);
	(*text) = new char[M];
	strcpy((*text)+1, buffer);
	fclose(fp);
}
void prefix_table(char* string)
{
	prefix[1] = 0;
	int i = 0;
	for (int j = 2; j <= N; j++)
	{
		while (i > 0 && string[i+1] != string[j])
			i = prefix[i];
		if (string[i+1] == string[j])
			i++;
		prefix[j] = i;
	}
}
void KMP(int *poz,char* string, char* text)
{
	int i = 0;
	for (int j = 1; j <= M; j++)
	{
		while (i > 0 && string[i + 1] != text[j])
		{
			i = prefix[i];
		}
		if (string[i + 1] == text[j])
			i = i + 1;
		if (i == N)
		{
			pos[(*poz)++] = j - N;
			i = prefix[i];
		}
	}
}
int main()
{
	FILE* fout = fopen("strmatch.out", "w");
	char* A, * B;
	read_data(&A, &B, "strmatch.in");
	prefix_table(A);
	int poz = 0;
	KMP(&poz, A, B);
	fprintf(fout,"%d\n", poz);
	for (int i = 0; i < poz; i++)
	{
		fprintf(fout,"%d ", pos[i]);
	}
	return 0;

}