Cod sursa(job #2424587)

Utilizator nicu97oTuturuga Nicolae nicu97o Data 23 mai 2019 12:41:33
Problema Potrivirea sirurilor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <iostream>
#include <fstream>
using namespace std;
#define N 2000000
#define MAX_SOL_SIZE 1001

ifstream fin("strmatch.in");
ofstream fout("strmatch.out");
char a[N];
char b[N];


int bernsteinHash(char* key, int len);

void readStringFromFile(char* string, int* currentPos);

void findStringMatchPositions(char* a, int sizeA, char* b, int sizeB, int* sol);

int main() {
	char currentChar;
	int sizeA = 0;
	int sizeB = 0;
	int sol[MAX_SOL_SIZE];
	readStringFromFile(a, &sizeA);
	readStringFromFile(b, &sizeB);
	findStringMatchPositions(a, sizeA, b, sizeB, sol);
	return 0;
}

void findStringMatchPositions(char* a, int sizeA, char* b, int sizeB, int* sol) {
	int counter = 0;
	char* strToMatch = (char*)malloc(sizeof(char) * sizeA);
	int aHash = bernsteinHash(a, sizeA);
	int strToMatchHash = 0;
	for (int i = 0; i <= sizeB - sizeA; ++i) {
		for (int j = 0; j < sizeA; ++j) {
			strToMatch[j] = b[i + j];
		}
		strToMatchHash = bernsteinHash(strToMatch, sizeA);
		if (aHash == strToMatchHash) {
			if (counter + 1 < MAX_SOL_SIZE) {
				sol[counter] = i;
			}
			counter++;
		}
	}
	free(strToMatch);
	fout << counter << '\n';
	for (int i = 0; i < counter; ++i) {
		fout << sol[i] << ' ';
	}
}

void readStringFromFile(char* string, int* currentPos) {
	char currentChar;
	while(true){
		fin.get(currentChar);
		if (currentChar == '\n' || fin.eof()) {
			break;
		}
		string[(*currentPos)++] = currentChar;
	} 
	string[(*currentPos)] = '\0';
}

int bernsteinHash(char* key, int len) {
	int h = 0;
	for (int i = 0; i < len; ++i) {
		h = 33 * h + key[i];
	}
	return h;
}