Pagini recente » Cod sursa (job #2642759) | Cod sursa (job #1971308) | Cod sursa (job #557999) | Cod sursa (job #983179) | Cod sursa (job #2424587)
#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;
}