Subseqüències en camins d'un arbre (PRO2) X82446


Statement
 

pdf   zip   tar

html

Heu d’implementar un programa que llegirà un arbre d’enters t i també vàries seqüències d’enters. Per a cada seqüència s, el programa haurà de calcular quantes fulles hi ha a t tals que els elements de s es troben en el camí des de l’arrel fins a aquella fulla, en el mateix ordre, i a on possiblement hi pot haver també altres valors. Recordeu que una fulla és un arbre amb un únic node, i que per tant els seus dos fills directes són arbres buits.

Per exemple, considereu el següents arbre i seqüència:

Entrada:

             5
             |
      ------- -------
     |               |
     1               2
     |               |
      ----       ---- ----
          |     |         |
          5     1         3
          |               |
      ---- ----       ----
     |         |     |
     2         3     2
     |
 ---- ----
|         |
3         1

1 2

Sortida:

2

En total hi ha 2 fulles tals que en el camí des de l’arrel fins a qualsevol d’aquelles fulles ens hi apareix la seqüència s (en el mateix ordre, i també enmig d’altres valors). Mostrem a continuació quins serien els 2 camins, que indiquem amb els valors dels nodes visitats:

5, 1, 5, 2, 3
5, 1, 5, 2, 1

Fixeu-vos que l’enunciat d’aquest exercici ofereix el fitxer BinTree.hh que haureu d’incloure des del vostre programa. Només cal que pugeu el vostre programa al jutge.

De cara a llegir el format d’entrada i l’arbre, us recomanem aquestes línies:

    string format;
    getline(cin, format);
    BinTree<int> t;
    t.setInputOutputFormat(format=="INLINEFORMAT"?  BT::INLINEFORMAT  :  BT::VISUALFORMAT);
    cin >> t;
    cin.ignore();

Entrada

La primera linia de l’entrada descriu el format en el que es descriuen els arbres, o bé INLINEFORMAT o bé VISUALFORMAT.

Després ve la descripció d’un únic arbre binari d’enters, l’arbre t.

Cadascuna de les següents línies conté una seqüència d’enters. La podeu llegir i emmagatzemar com considereu convenient. Però penseu bé com ho feu (queue, stack, list, vector), doncs hi haurà maneres que faran més fàcil implementar un programa eficient.

Sortida

Per a cadascuna de les seqüències hi ha un valor de sortida en una línia, el nombre de fulles de t que cumpleixen la condició abans esmentada.

Observació

Aquest exercici requereix d’una bona optimització per tal de superar els jocs de proves privats.

Public test cases
  • Input

    VISUALFORMAT
                        1
                        |
                    ---- ----
                   |         |
                   5         2
                   |
               ---- ----
              |         |
              3         0
              |
          ----
         |
         3
         |
     ----
    |
    6
    
    1 0
    1 5
    3 3
    1 2
    1 3 3
    2
    1
    

    Output

    1
    2
    1
    1
    1
    1
    3
    
  • Input

    INLINEFORMAT
    6(2(0(1(5(4(,2(8,)),4(10(10,3),7(10,))),4(10,7)),),6),7(5(4(3,10),1),9(,10(6(1,),3(10(6,),)))))
    6 2 1 10 3
    6
    6 2 0
    7 5 1
    7 9
    6 10
    6
    6 7
    6
    
    5
    6 0
    6 2
    7 4
    6 1
    6 2
    6 2 6
    6
    6 10
    9
    

    Output

    1
    12
    6
    1
    2
    7
    12
    7
    12
    12
    7
    6
    7
    2
    8
    7
    1
    12
    7
    2
    
  • Information
    Author
    PRO2
    Language
    Catalan
    Official solutions
    C++
    User solutions
    C++