Cod sursa(job #1287395)

Utilizator Mihai96Saru Mihai Mihai96 Data 7 decembrie 2014 14:30:20
Problema Potrivirea sirurilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include <fstream>
#include <vector>
#include <string>

using namespace std;

const char NUME_FISIER_INTRARE[] = "strmatch.in";
const char NUME_FISIER_IESIRE[] = "strmatch.out";
const int MAX_NR_POZITII = 1000;

struct DateIntrare{
	string *str1;
	string *str2;

	void aloca(){
		str1 = new string();
		str2 = new string();
	}
	void sterge(){
		delete str1;
		delete str2;
	}
};

struct DateIesire{
	int n;
	vector<int> *pozitii;

	void initializeaza(){
		n = 0;
		pozitii = new vector<int>(MAX_NR_POZITII);
	}

	void sterge(){
		delete pozitii;
	}

	void adaugaSolutie(int pozitie){
		if(n < MAX_NR_POZITII){
			(*pozitii)[n++] = pozitie;
		}else{
			n++;
		}
	}
};


DateIntrare citesteDate(const char filename[]){
	DateIntrare date_intrare;
	date_intrare.aloca();
	ifstream fin(filename);
	
	fin >> (*date_intrare.str1);
	fin >> (*date_intrare.str2);
	fin.close();

	return date_intrare;
}

DateIesire strMatch(const DateIntrare &date_intrare){
	int n = (*date_intrare.str1).size();
	int m = (*date_intrare.str2).size();
	DateIesire date_iesire;
	date_iesire.initializeaza();

	for(int i = 0; i < (m - n + 1); ++i){
		int j = 0;
		while((*date_intrare.str1)[j] == (*date_intrare.str2)[i+j] && j < n) {++j;}

		if(j == n){
			date_iesire.adaugaSolutie(i);
		}
	}
	
	return date_iesire;
}

void scrieDate(const DateIesire &date_iesire, const char filename[]){
	ofstream fout(filename);
	
	fout << date_iesire.n << "\n";
	for(int i = 0; i < date_iesire.n; ++i){
		fout << (*date_iesire.pozitii)[i] << " ";
	}
	fout.close();
}


int main(int argc, char *argv[]){
	DateIntrare date_intrare;
	DateIesire date_iesire;
	date_intrare = citesteDate(NUME_FISIER_INTRARE);
	date_iesire = strMatch(date_intrare);
	scrieDate(date_iesire, NUME_FISIER_IESIRE);

	date_intrare.sterge();
	date_iesire.sterge();

	return 0;
}