Zadanie
Escape character
Počet bodov: 35, časový limit: 2000ms
V reťazcoch reprezentovaných v počítači sa často vyskytujú špeciálne znaky, ktoré nie sú vypísané, ale vykonávajú nejakú funkciu, napríklad koniec riadku: \n
. Aby sme s nimi vedeli pohodlne manipulovať, reprezentujeme ich ako niektorý obyčajný, vypísateľný znak, pred ktorý vložíme tzv. ‘escape’ – v horeuvedenom príklade znak \
.
Buj si na miestnom trhu kúpil reťazec \(S\) dĺžky \(n\) na (vraj zcela vrámci zákona) domácu manipuláciu.
Nedržal sa pri tom starého príslovia ‘nekupuj reťazec vo vreci’.
Keď prišiel domov a vytiahol reťazec z vreca, z hrôzou zistil, že jeho znaky nenasledujú žiadne známe kódovanie. Jediné, čo vedel, je očíslovať jeho znaky od \(0\) po \(n-1\).
Ničto, nejak ten reťazec predsa už len zmanipuluje, pomyslel si Buj. Bál sa však, že ho na trhu podviedli a predali mu nekvalitný reťazec – taký, ktorý keď vypíšeme, tak je lexikograficky veľký.
To však závisí od toho, ktorý znak v reťazci je ten ‘escape’. Pre každý znak ho zaujíma, ako veľmi dobrý reťazec by to bol, ak by zrovna tento znak bol escape. Reťazec poslal poštou nám, a my sme veľmi dobrí v hľadaní lacnej pracovnej sily…
Vstup a výstup
V prvom riadku vstupu je číslo \(n\): počet znakov v Bujovom reťazci. V druhom riadku vstupu je permutácia čísel \(0, \cdots, n-1\) popisujúca Bujov reťazec \(S\). Znaky sú očíslované od (lexikograficky) najmenšieho po najväčší.
Escape znak funguje nasledovne: ak je to posledný znak v reťazci, nemá žiadny efekt, a je stále vypísaný na výstupe. Inak sú vypísané všetky znaky okrem neho a znaku bezprostredne za ním. Pre lepšie pochopenie si prečítajte príklad.
Nech \(S_i\) je reťazec ktorý sa vypíše na výstup, ak zvolíme znak číslo \(i\) ako escape v Bujovom reťazci \(S\). Zoraďme si všetky takéto reťazce lexikograficky od najmenšieho po najväčší, a nech \(p_i\) je pozícia reťazca \(S_i\) v tomto zoradení, začínajúc od nuly.
Vypíšte do jedného riadku \(p_0, p_1, \cdots, p_{n-1}\), oddelené medzerami. Teda postupne vypíšte odpovede na otázky:
- “Koľko reťazcov spomedzi \(S_0, \ldots, S_{n-1}\) je lexikograficky menších ako ten, ktorý by sme vypísali, ak je znak \(0\) escape?”
- “Koľko by ich bolo, ak by znak \(1\) bol escape?”
- “Čo ak znak \(2\) je escape?”
- …
Dajte si pozor na to, že \(i\)-ta odpoveď sa vzťahuje ku znaku číslo \(i\), nie ku v poradí \(i\)-temu znaku (rátajúc od \(0\)).
V polovici vstupov platí \(1 \leq n \leq 3\,000\), v druhej polovici \(1 \leq n \leq 10^6\).
Príklad
Input:
3
0 1 2
Output:
2 0 1
Ak je znak \(0\) escape, vypísali by sme reťazec \(2\). Ak je znak \(1\) escape, vypísali by sme \(0\). Ak je znak \(2\) escape, vypísali by sme \(0~1~2\).
Zoradené reťazce sú teda \([0, 0~1~2, 2]\). Máme teda dva reťazce menšie ako \(S_0\), žiadne menšie ako \(S_1\), a jeden menší ako \(S_2\).
Pre odovzdávanie sa musíš prihlásiť.