]> git.llucax.com Git - z.facultad/75.29/susanita.git/blobdiff - src/parser.cpp
Hacer que todos_h_comprometidos() sea O(1).
[z.facultad/75.29/susanita.git] / src / parser.cpp
index f15b9c7ee2bec68585456461c7029755c3b3085c..c4453ccdc074fec79b8df1ee5aa5fa50d8a7db67 100644 (file)
@@ -16,11 +16,20 @@ Parser(Susanita& s):
 namespace
 {
        /// Saca espacios de una palabra
 namespace
 {
        /// Saca espacios de una palabra
-       std::string strip(std::string s)
-       {
-               std::istringstream ss(s);
-               ss >> s;
-               return s;
+       std::string strip(std::string s) {
+               std::string ws = " \t\n";
+               int first = s.find_first_not_of(ws);
+               int last = s.find_last_not_of(ws);
+
+               if (first == -1) {
+                       int pos_first = s.find_first_of(ws);
+                       if (pos_first == -1) {
+                               return s;
+                       } else {
+                               return std::string("");
+                       }
+               }
+               return s.substr(first,last-first+1).c_str();
        }
 
        /// Devuelve palabra hasta el caracter indicado
        }
 
        /// Devuelve palabra hasta el caracter indicado
@@ -41,6 +50,9 @@ input(const std::string& filename)
                return false;
        Persona::sexo_type sexo = Persona::M;
        Persona::sexo_type opuesto = Persona::F;
                return false;
        Persona::sexo_type sexo = Persona::M;
        Persona::sexo_type opuesto = Persona::F;
+
+       Susanita::size_type cap = get_n(filename);
+
        std::string l;
        while (std::getline(f, l))
        {
        std::string l;
        while (std::getline(f, l))
        {
@@ -59,21 +71,27 @@ input(const std::string& filename)
                Persona* pp = susanita.get_persona(nombre);
                if (!pp)
                {
                Persona* pp = susanita.get_persona(nombre);
                if (!pp)
                {
-                       pp = new Persona(nombre, sexo);
+                       pp = new Persona(nombre, sexo, cap);
                        susanita.add_persona(pp);
                }
 
                        susanita.add_persona(pp);
                }
 
-               Persona::prefs_type prefs;
+               int count = 0;
                while (ss)
                {
                        std::string nombre = get_hasta(ss, ',');
                while (ss)
                {
                        std::string nombre = get_hasta(ss, ',');
+                       nombre = strip(nombre);
+                       if (nombre.empty()) {
+                               continue;
+                       }
                        Persona* ppp = susanita.get_persona(nombre);
                        if (!ppp)
                        {
                        Persona* ppp = susanita.get_persona(nombre);
                        if (!ppp)
                        {
-                               ppp = new Persona(nombre, opuesto);
+                               ppp = new Persona(nombre, opuesto, cap);
                                susanita.add_persona(ppp);
                        }
                        pp->prefs.push_back(ppp);
                                susanita.add_persona(ppp);
                        }
                        pp->prefs.push_back(ppp);
+                       pp->prefs_hash[ppp->nombre] = count;
+                       count++;
                }
        }
        return true;
                }
        }
        return true;
@@ -102,3 +120,27 @@ output() const
        }
 }
 
        }
 }
 
+/// Hack medio feo para obtener el N del problema
+Susanita::size_type
+Parser::
+get_n(const std::string& filename)
+{
+       std::ifstream f(filename.c_str());
+       if (!f)
+               return 0;
+       std::string l;
+       if (!std::getline(f, l))
+               return 0;
+       std::istringstream ss(strip(l));
+       // descartamos el nombre
+       get_hasta(ss, ':');
+       // contamos personas en la lista
+       Susanita::size_type count = 0;
+       while (ss)
+       {
+               if (!strip(get_hasta(ss, ',')).empty())
+                       ++count;
+       }
+       return count;
+}
+