CSES - Datatähti 2022 loppu - Kanava
  • Language:
  • Time limit: 1.00 s
  • Memory limit: 512 MB

Kommunikaatiokanavan kautta voidaan lähettää kolmenlaisia symboleja: lyhyt (0), pitkä (1), sekä tauko (_). Jokainen lähetettävä sana tulee koodata näiden symbolien avulla.

Lähetystä vastaanotettaessa alussa ja lopussa olevia taukoja ei tunnisteta, eikä eri pituisia taukoja voida erottaa toisistaan. Siispä jos kanavaa pitkin lähetetään esimerkiksi sarja __110__01_, vastaanottaja näkee sarjan 110_01.

Lähetys koostetaan yhdistämällä n sanan koodaukset peräkkäin. Sanat voivat olla missä tahansa järjestyksessä, ja sama sana voi esiintyä lähetyksessä useasti. Sanojen väleille ei tule ylimääräisiä taukoja.

Suunnittele ohjelma, joka koodaa sanoja kanavaa varten mahdollisimman lyhyiksi sarjoiksi ja purkaa vastaanotetun lähetyksen sisällön.

Syöte

Syötteen ensimmäisellä rivillä on kokonaisluku t, joka on joko 1, jos halutaan koodata sanoja, tai 2, jos halutaan purkaa lähetys.

Jos t=1, niin toisella rivillä on kokonaisluku k: koodattavien sanojen määrä. Seuraavat k riviä sisältävät kukin sanan, joka koostuu merkeistä a–z.

Jos t=2, niin toisella rivillä on merkkijono, joka kuvaa vastaanotetun lähetyksen merkeillä 0, 1 ja _.

Tuloste

Jos t=1, tulosta omalle rivilleen jokaista sanaa vastaava koodaus käyttäen merkkejä 0, 1 ja _.

Jos t=2, tulosta ensimmäiselle riville kokonaisluku n: kuinka monta sanaa lähetys sisältää. Tämän jälkeen tulosta lähetyksestä puretut n sanaa kukin omalle rivilleen.

Esimerkki (koodaus)

Syöte:

1
2
abc
sos

Tuloste:

_1__00
000111000

Esimerkki (purku)

Syöte:

2
1_00000111000_1_00

Tuloste:

3
abc
sos
abc

Rajat

  • k = 520
  • 1 \le n \le 1000
  • Jokaisen sanan pituus on korkeintaan 10.

Arvostelu

Ohjelmallesi annetaan 520 sanaa koodattavaksi. Eri pituisia sanoja 110 on kutakin 52 kappaletta. Syöte on valittu satunnaisesti niin, että jokaista merkkiä on yhteensä sama määrä. Jos sanoista muodostettu lähetys purkautuu alkuperäisten sanojen mukaisesti oikein, saat tehtävästä pisteitä seuraavasti:

Olkoon a=2860 alkuperäisten sanojen yhteispituus ja b koodattujen sanojen symbolien määrä yhteensä, sisältäen kaikki tauot. Ansaitsemasi pistemäärä on \lceil 1000(a/b - 1/6) \rceil, kuitenkin korkeintaan 100 pistettä. Merkintä \lceil x \rceil tarkoittaa pyöristystä ylöspäin.

Jos esimerkiksi yksi koodattu symboli esittää keskimäärin 0.216 sanan merkkiä, saat 50 pistettä.