Cod sursa(job #1998245)

Utilizator contnouAndrei Pavel contnou Data 7 iulie 2017 01:33:05
Problema Potrivirea sirurilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include<fstream>
#include<string.h>
#define MAXLEN 2000005

using namespace std;

ifstream f("strmatch.in");
ofstream g("strmatch.out");

char A[MAXLEN], B[MAXLEN];
int prefix[MAXLEN];

void buildPrefixArray(int *prefix, char *A) {
	//
	int crt = 0;
	int l = strlen(A);
	prefix[0] = 0;
	for (int i = 1; i < l; i++) {
		int len = prefix[i - 1];
		while (len != 0 && A[len] != A[i]) {
			len = prefix[len];
		}
		if (A[len] == A[i]) prefix[i] = len + 1;
	}
}

void printMatches(int prefix[], char A[], char B[]) {
	//
	int crt = 0;
	int lB = strlen(B);
	int lA = strlen(A);
	int len = 0;
	for (int i = 0; i < lB; i++) {
		//
		while (len != 0 && A[len] != B[i]) {
			len = prefix[len];
		}
		if (A[len] == B[i]) len++;
		if (len == lA) {
			g << i - lA + 1 << " ";
			len = prefix[len - 1];
		}
	}
}
int main() {
	//
	f >> A;
	f >> B;
	buildPrefixArray(prefix, A);
	printMatches(prefix, A, B);
	return 0;
}