Zoznam úloh

5. Lenivé prasa

Kolo už skončilo. Môžeš si pozrieť vzorové riešenie.

V jeden zimný deň si Buj povedal, že bude lenivé prasa. Namiesto toho, aby šiel poctivo do školy, vybral sa do supermarketu, nakúpil neskutočne veľa čokolády, a potom ju zvyšok dňa konzumoval.

V ten deň zadal pán profesor algebry domácu úlohu. Buj sa o nej síce dozvedel z internetovej stránky predmetu, ale keďže na hodine nebol, netuší, ako ju má riešiť. Pomôžte mu!

Úloha

V tejto úlohe budeme pracovať s kompletne uzátvorkovanými výrazmi. Tie si definujeme takto:

  • Reťazec $a$ (jedno konkrétne písmeno a) je kompletne uzátvorkovaný výraz.

  • Ak $A$ a $B$ sú kompletne uzátvorkované výrazy, tak aj $(A + B)$ je kompletne uzátvorkovaný výraz.

  • Nič, čo sa nedá vyskladať postupným použitím dvoch predchádzajúcich pravidiel, nie je kompletne uzátvorkovaný výraz.

Podľa tejto definície sú kompletne uzátvorkované výrazy napríklad $a$, $(a+a)$, $((a+a)+a)$ a $(((a + a) + (a + a)) + ((a + a) + (a + a)))$. Vonkajšie zátvorky vo výrazoch vynechávame. Napríklad, namiesto $(a+(a+a))$ píšeme $a+(a+a)$.

Na vstupe dostanete dva kompletne uzátvorkované výrazy. O nich chceme dokázať, že sa rovnajú. Môžeme pritom použiť iba asociatívny zákon, ktorý hovorí, že $A+(B+C) = (A+B)+C$. V podstate teda chceme previesť prvý výraz na druhý, pričom sú povolené len dve operácie:

  • Ak v našom výraze máme podvýraz tvaru $(A+B)+C$, tak ho môžeme prepísať na $A+(B+C)$. Napríklad výraz $$a + ((\, \overbrace{(a + a)}^{A} + \overbrace{\vphantom{(}a}^{B}) + \overbrace{(a + a)}^{C}\,)$$ môžeme prepísať na $$a + (\, \overbrace{(a + a)}^{A} + (\overbrace{\vphantom{(}a}^{B} + \overbrace{(a + a)}^{C}\,)) \text{.}$$ Tejto operácii budeme hovoriť rotácia doprava.

  • Prepísaniu opačným smerom, teda nahradenie podvýrazu tvaru $A+(B+C)$ výrazom $(A+B)+C$, budeme hovoriť rotácia doľava.

Vašou úlohou je nájsť postupnosť rotácii, ktorou prevedieme prvý výraz na druhý.

Formát vstupu

Na prvom riadku vstupu je kladné číslo $t$: počet testov. Nasledujú popisy jednotlivých testov. Každý test začína prázdnym riadkom, za ktorým nasledujú dva riadky obsahujúce jednotlivé výrazy. Môžete predpokladať, že oba výrazy majú rovnakú dĺžku, $n$.

Je osem sád testovacích vstupov, obmedzenia pre jednotlivé sady sú nasledovné:

Sada $1$ $2$ $3$ $4$ $5$ $6$ $7$ $8$
$t \leq$ $1\,000$ $100$ $10$ $1$ $1$ $1$ $1$ $1$
$n \leq$ $40$ $120$ $400$ $1\,200$ $4\,000$ $12\,000$ $40\,000$ $400\,000$

Formát výstupu

Pre každý test vypíšte postupnosť rotácii, ktorou prevedieme prvý výraz na druhý, v nasledujúcom formáte. Na prvom riadku nech je dĺžka postupnosti, $k$, a na nasledujúcich $k$ riadkoch nech sú popisy jednotlivých rotácii v poradí, v akom ich vykonáme.

Očíslujme si znaky $+$ v našom výraze zľava doprava $1, 2, \ldots$, teda ak by sme z výrazu vynechali zátvorky, dostali by sme

$$a +_1 a +_2 a +_3 a +_4 \ldots$$

Rotáciu doprava z $(A +_i B) +_j C$ na $A +_i (B +_j C)$ zapíšeme ako riadok “$j$ R”. Podobne, rotáciu doľava z $A +_i (B +_j C)$ zapíšeme ako “$i$ L”.

Príklady

Input:

2

a+(a+(a+a))
((a+a)+a)+a

(a+a)+(a+a)
a+((a+a)+a)

Output:

2
1 L
2 L
3
2 L
2 R
3 R

Prvý postup: $$a+(a+(a+a))\ \rightarrow\ (a+a)+(a+a)\ \rightarrow\ ((a+a)+a)+a$$ Druhý postup: $$(a+a)+(a+a)\ \rightarrow\ ((a+a)+a)+a\ \rightarrow\ (a+(a+a))+a\ \rightarrow\ a+((a+a)+a)$$ Všimnite si, že druhý test sa dá vyriešiť aj na dve rotácie. Nám však stačí vypísať ľubovoľný funkčný postup.

Pre odovzdávanie sa musíš prihlásiť.
Trojsten

Korešpondenčný seminár z programovania zastrešuje občianske združenie Trojsten.

Kontakt
Ďalšie projekty