
Deprecated: Function set_magic_quotes_runtime() is deprecated in /DISK2/WWW/lokiware.info/mff/wakka.php on line 35
#pragma warning (disable : 4018 4267)

#include <iostream>
#include <vector>
#include <fstream>
#include <string>
#include <set>
#include <algorithm>

using namespace std;

//upravi string do vypisatelneho formatu
string write_row(string s)
{
	string ss;
	for (int i = 0; i < s.length(); i++)
	{
		ss = ss + s[i] + "   ";		
	}
	return ss;
}
//porovnavadlo na sortenie vektorov vektorov
bool compareVectorString(vector<string> v1,vector<string> v2)
{
	if (v1.at(0).compare(v2.at(0)) < 0) return true;
	else return false;
}
//doplni string @fillme nulami na lenght @size
string fill_to_size(int size, string fillme)
{
	while (fillme.length() != size) fillme+='0';
	return fillme;
}
//entrance point
int main(int argc, char ** argv)
{
	string reader;
	vector<string> line_vector;
	vector<vector<string>> lines_vector;
	set<string> vvv;
	ifstream ins;
	char * infile, * outfile;


	//uprava arg
	argc--; argv++;

	//sanity check
	if (argc < 2) 
	{
		cerr << "Not enough arguments" << endl;
		return -1;
	}

	infile = argv[0];
	outfile = argv[1];
	ins.open(infile);
	if (!ins.is_open())
	{
		cerr << "Error opening input file" << endl;
		return -1;
	}

/**********************************************CITANIE*******************/
	while (!ins.fail())
	{
		//nacitanie
		ins >> reader;
		//ignore poznamok a volnych riadkov
		if ((reader[0] != 0) && (reader[0] == '#')) 
		{		
			while (ins.peek() != 10) ins >> reader;
			continue;
		}

		//parse the first line
		line_vector.push_back(reader.substr(0, reader.find_first_of(":")));
		vvv.insert(reader.substr(0, reader.find_first_of(":")));
		reader.erase(0,reader.find_first_of(":")+1);
	
		//parse all other lines
		while (reader.length()!=0)
		{
			line_vector.push_back(reader.substr(0, reader.find_first_of(",")));
			vvv.insert(reader.substr(0, reader.find_first_of(",")));
			reader.erase(0,reader.find_first_of(",")+1);
		}

		vector<string>::iterator i = line_vector.begin();
		i++;
		//sortneme vsetko okrem prveho prvku
		sort(i, line_vector.end());

		lines_vector.push_back(line_vector);
		line_vector = *new vector<string>;		
	}
	ins.close();
/**********************************************CITANIE*******************/

/************************************PROCESSING VRCHOLOV*****************/
	sort(lines_vector.begin(), lines_vector.end(), compareVectorString);

	//upravit nach su normalne
	vvv.erase(vvv.begin());
	lines_vector.erase(lines_vector.begin());

	set<string>::iterator i = vvv.begin();						//pre robenie riadkov
	set<string>::iterator stlpce;								//pre robenie stlpcov
	vector<vector<string>>::iterator ii = lines_vector.begin(); //pre prechadzanie vektoru
	
	/**zaciatok vypisu*/
	ofstream outs;
	int pozicia = 0;	
	outs.open(outfile);	
	if (!outs.is_open())
	{
		cerr << "Error opening output file" << endl;
		return -1;
	}

	outs << "   ";

	for (;i!=vvv.end();++i) outs << *i << " ";	
	outs << endl;
	i = vvv.begin();
	
	//PRE KAZDY VRCHOL ktory mame
	while(i != vvv.end())
	{
		//ak tento vrchol ma vo vektore vektorov svoj vektor
		if (!(*i).compare((*ii).at(0))) //je to 0, cize sa rovnaju
		{			
			int pozicia = 1;
			string riadok = "";
			stlpce = vvv.begin();

			while ((stlpce != vvv.end()) && (pozicia != (*ii).size()))
			{
				if ((*ii).at(pozicia).compare(*stlpce) == 0)  //rovnaju sa
				{
					riadok+='1';
					stlpce++;
					pozicia++;
				}
				else 
					if ((*ii).at(pozicia).compare(*stlpce) > 0) //ii je vacsi
					{
						stlpce++;
						riadok+='0';
					}
					else
					{	
						pozicia++;
						riadok+='0';
					}
			}
	
			outs << *i << " " ;
			outs << write_row(fill_to_size(vvv.size(), riadok));
			ii++;
			i++;
		}
		else 
		{
			if ((*i).compare((*ii).at(0)) > 0) //i je vacsie ako ii, ii mozeme posunut
			{				
			++ii; //posun 			
			}
			else //i je mensie ako ii, zvacsi i
			{
			outs << *i << " " ;
			outs << write_row(fill_to_size(vvv.size(), *new string("")));
			++i;
			}
		}
		outs << endl;
	}
	outs.close();
/************************************PROCESSING VRCHOLOV*****************/

	cout << "Prevod dokonceny uspesne, vysledok v " << outfile << endl;
	cout << "Special ThanX to MFF UK (C) 2008" << endl;
	return 0;
}
