tpl1-2013.cpp
/* COMIENZO DE DESCRIPCION
__USE_WIKI__
Escribir una funcion #void split_mod(list<int> &L, int m,#
#vector<list<int> > &VL);# que dada una lista #L#, y un entero #m#
divide a la lista en las sublistas de los elementos que son
congruentes entre si modulo #m#. Es decir en #VL[j]# deben
quedar los elementos tales que #x%m==j#.
Escribir una funcion predicado #bool is_sublist(list<int> &L1,#
#list<int> &L2);# que determina si #L2# es una sublista de #L1#
es decir si #L2# se puede obtener de #L1# solo borrando elementos
de L1.
Escribir una funcion #void max_sublist(list<int> &L,#
#list<int> &subl);# que
dada una lista #L# retorna la maxima sublista contigua de #L# con
elementos pares #subl#.
[Tomado en el TPL1 de 2013-08-31].
keywords: lista
FIN DE DESCRIPCION */
// -----------------------------------------------------------------
#include "Evaluar.hpp"
#include <cstdio>
void split_mod(list<int>&L, int m,
vector< list<int> >&VL) {
list<int>::iterator q = L.begin();
VL.clear();
VL.resize(m);
while (q!=L.end()) {
int r = *q % m;
VL[r].push_back(*q++);
}
}
bool is_sublist(list<int>&L1, list<int>&L2) {
list<int>::iterator
q1 = L1.begin(),
q2 = L2.begin();
while (q1!=L2.end() && q2!=L2.end()) {
if (*q1==*q2) q2++;
else q1++;
}
return q2==L2.end();
}
void max_sublist(list<int>&L, list<int>&subl) {
list<int> tmp;
list<int>::iterator q = L.begin();
subl.clear();
while (q!=L.end()) {
if (*q%2==0) {
tmp.clear();
while (q!=L.end() && *q%2==0) tmp.push_back(*q++);
if (tmp.size()>subl.size()) subl = tmp;
} else q++;
}
}
void max_sublist2(list<int>&L, list<int>&subl) {
// Esta version es mas eficiente. Solo guarda un
// iterator al comienzo de la lista mas larga.
// Despues cuando termina copia esa lista en subl
list<int> tmp;
list<int>::iterator
q = L.begin(),
qmin=q, r;
int lmax = 0;
subl.clear();
while (q!=L.end()) {
while (q!=L.end() && *q%2) q++;
int l=0; r=q;
while (q!=L.end() && *q%2==0) { l++; q++; }
if (l>lmax) { lmax=l; qmin=r; }
}
subl.clear();
q=qmin;
for (int j=0; j<lmax; j++) subl.push_back(*q++);
}
int main() {
aed::Evaluar ev;
ev.evaluar1(split_mod);
ev.evaluar2(is_sublist);
ev.evaluar3(max_sublist);
return 0;
}
Generated by GNU Enscript 1.6.6.