En aquest exercici heu de fer vàries coses.
En primer lloc, haureu d’implementar una funció que rep un string s que cumpleix unes condicions molt partículars de bon principi: l’string està format per tres caràcters diferents c1, c2, c3. A més a més, al principi de s hi trobem el caràcter c1 una o més vegades, després ve el caràcter c2 una o més vegades, i finalment ve el caràcter c3 una o més vegades. La funció tindrà també tres paràmetres enters per referència n1, n2, n3, a on hi haurà de dipositar el nombre d’ocurrències de c1, c2, c3, respectivament. Aquesta és la capcelera:
// 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: els jocs de proves privats d’aquest exercici son grans estan dissenyats per a que calgui una implementació de cost logaritmic de numberSubsequences. Una implementació lenta us permetrà només superar els jocs de proves públics i obtenir la meitat de la n ota.
En segon lloc, haureu d’implementar una funció que rep un string s que cumpleix una de les següents condicions:
En els casos (1) i (2) anteriors, la funció retornarà el nombre de subseqüències felices de s, i en els casos (3) i (4) anteriors, la funció retornarà el nombre de subseqüencies tristes de s. Una subseqüència feliç és una subsequència de tres caràcters, i a on aquests tres caràcters són, o bé :-) o bé (-:, en l’ordre donat. Una subseqüència trista és una subsequència de tres caràcters, i a on aquests tres caràcters són, o bé :-( o bé )-:, en l’ordre donat. Aquestes son les capceleres:
// 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ó anterior haurà d’usar convenientment la funció numberOccurrences mencionada al principi. En cas contrari, s’invalidarà l’entrega.
Observació Només cal enviar el procediment demanat; el programa principal serà ignorat.
Observació
Avaluació sobre 10 punts:
Entenem com a solució ràpida una que és correcta, de cost logarítmic i capaç de superar els jocs de proves públics i privats. Entenem com a solució lenta una que no és ràpida, però és correcta i capaç de superar els jocs de proves públics.
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