En este ejercicio tenéis que hacer varias cosas.
En primer lugar, tenéis que implementar una función que recibe un string s que cumple unas condiciones muy particulares: s está formado por tres caracteres diferentes c1, c2, c3. Además, al principio de s encontramos el carácter c1 una o más veces, después viene el caracter c2 una o más veces, y finalmente viene el carácter c3 una o más veces. La función tendrá también tres parámetros enteros por referencia n1, n2, n3, donde deberá asignar el número de ocurrencias de c1, c2, c3, respectivamente. Esta es la cabecera:
// Pre: s is formed with three different characters c1,c2,c3, and is of the form c1...c1c2...c2c3...c3. // Post: n1, n2, n3 are the number of occurrences of c1, c2, c3 in s, respectively. void numberOccurrences(const string &s, int &n1, int &n2, int &n3);
Nota: los juegos de pruebas privados de este ejercicio son grandes y están diseñados para que haga falta una implementación de coste logarítmico de numberSubsequences. Una implementación lenta os permitirá superar solamente los juegos de pruebas públicos y obtener la mitad de la nota.
En segundo lugar, tenéis que implementar una función que recibe un string s que cumple una de las siguientes condiciones:
En los casos (1) y (2) anteriores, la función retornará el número de subsecuencias felices de s, y en los casos (3) y (4) anteriores, la función retornará el número de subsecuencias tristes de s. Una subsecuencia feliz es una subsecuencia de tres caracteres, y donde estos tres caracteres son, o bien :-) o bien (-:, en el orden dado. Una subsecuencia triste es una subsecuencia de tres caracteres, y donde estos tres caracteres son, o bien :-( o bien )-:, en el orden dado. Esta es la cabecera:
// Pre: s begins with one or more occurrences of a character c1, followed by one or more // occurrences of a character c2, followed by one or more occurrences of a character c3, // and there are no more characters in s. // moreover, either c1c2c3 = ":-)" or c1c2c3 = "(-:" or c1c2c3 = ":-(" or c1c2c3 = ")-:". // Post: If c1c2c3 = ":-)" or c1c2c3 = "(-:", the function returns the number of happy subsequences. // If c1c2c3 = ":-(" or c1c2c3 = ")-:", the function returns the number of sad subsequences. int numberHappyOrSadSubsequences(const string &s);
La función anterior anterior deberá usar convenientemente la función numberOccurrences descrita al principio. En caso contrario, se invalidará la entrega.
Observación Sólo tenéis que enviar el procedimiento requerido; el programa principal será ignorado.
Observación
Evaluación sobre 10 puntos:
Entendemos como solución rápida una que es correcta, de coste logarítmico y capaz de superar los juegos de pruebas públicos y privados. Entendemos como solución lenta una que no es rápida, pero es correcta y capaz de superar los juegos de pruebas públicos.
numberHappyOrSadSubsequences( ")---::" ) = 6 numberHappyOrSadSubsequences( "(((--:" ) = 6 numberHappyOrSadSubsequences( "(((---::" ) = 18 numberHappyOrSadSubsequences( "::----(((((" ) = 40 numberHappyOrSadSubsequences( "::---))" ) = 12 numberHappyOrSadSubsequences( ")))))---::::" ) = 60 numberHappyOrSadSubsequences( "::::---(" ) = 12 numberHappyOrSadSubsequences( ")))-----:" ) = 15 numberHappyOrSadSubsequences( ":::-----((((" ) = 60 numberHappyOrSadSubsequences( "(((--::" ) = 12 numberHappyOrSadSubsequences( "(((((--::::" ) = 40 numberHappyOrSadSubsequences( ":::::----)))" ) = 60 numberHappyOrSadSubsequences( "))----:" ) = 8 numberHappyOrSadSubsequences( "))))--:" ) = 8 numberHappyOrSadSubsequences( "::--(" ) = 4 numberHappyOrSadSubsequences( "(((-----:" ) = 15 numberHappyOrSadSubsequences( ":::::--)" ) = 10 numberHappyOrSadSubsequences( "(-----:::" ) = 15 numberHappyOrSadSubsequences( ":::-----(" ) = 15 numberHappyOrSadSubsequences( ":----(((((" ) = 20