InternationalOlympiadinInformatics2016 12-19thAugust2016 Kazan,Russia messy day2_2 Country:IDN MengembalikansebuahKesalahanKacau Ilshatadalahseorangsoftwareengineeryangbekerjadalamdatastrukturyang efisien.Suatuhariiamenemukansebuahdatastrukturbaru.Datastrukturinidapat menyimpansebuahhimpunanbilanganintegernon-negatif n -bit,yangmana n adalahsebuahbilanganduapangkat.Dengankatalain, n integernon-negatif b . = 2b untuksuatubilangan Datastrukturtersebutmula-mulakosong.Sebuahprogrammenggunakandata strukturtersebutharusmengikutiaturan-aturanberikut: Programdapatmenambahkanbilanganinteger n -bitkedalamdatastruktur, satupersatu,denganmenggunakanfungsiadd_element(x).Jikaprogram mencobamenambahkansebuahelemenyangtelahadadidalamdatastruktur, tidakakanadayangterjadi. Setelahmenambahkanelementerakhirprogramharusmemanggilfungsi compile_set()tepatsekali. Padaakhirnya,programbolehmemanggilfungsicheck_element(x)untuk mengujiapakahelemen x adadalamdatastruktur.Fungsiinidapatdigunakan beberapakali. KetikaIlshatmengimplementasidatastrukturiniuntukpertamakali,diamelakukan sebuahkesalahandalamfungsicompile_set().Kesalahannyamenyusunulangdigit binaryuntuktiapelemenpadahimpunandengancarayangsama.Ilshat menginginkanAndauntukmencarisusunanulangdigityangtepatyangdisebabkan olehkesalahantersebut. Secararesmi,pertimbangkansebuahurutan p = [p0 , … , pn−1 ] yangmanasetiap angkadari 0 sampai n − 1 muncultepatsekali.Kitamenyebuturutantersebut adalahsebuahpermutasi.Pertimbangkansebuahelemendarihimpunan,dimana digit-digitnyadalambinaryadalah a0 , … , an−1 (dengan a0 adalahbityangpaling signifikan).Ketikafungsicompile_set()dipanggil,elemeninidigantidengan elemen ap0 , ap1 , … , apn−1 . Permutasi p yangsamadigunakanuntukmenyusunulangdigit-digitdarisemua elemen.Semuapermutasimungkin,termasukkemungkinanyangmana pi = i untuksetiap 0 ≤ i ≤ n − 1 . Sebagaicontoh,anggapbahwa n = 4 , p = [2, 1, 3, 0] ,danAndatelah menambahkankehimpunanbilanganintegeryangmemilikirepresentasibinary 0000,1100dan0111.Memanggilfungsicompile_setmenggantielemen-elemenini menjadi0000,0101and1110,secaraberurutan. 1/4 TugasAndaadalahmenuliskansebuahprogramyangmencaripermutasi p dengan berinteraksidengandatastruktur.Programtersebutharus(denganurutanberikut): 1. memilihsebuahhimpunanbilanganinteger n -bit, 2. menambahkanbilangan-bilanganintegertersebutkedatastruktur, 3. memanggilfungsicompile_setuntukmencetuskankesalahan, 4. mengujiadanyabeberapaelemendarihimpunanyangtelahdiubah, 5. menggunakaninformasitersebutuntukmenentukandanmengembalikan permutasi p . PerhatikanbahwaprogramAndabolehmemanggilfungsicompile_sethanyasekali. Sebagaitambahan,terdapatsebuahbatasandaribanyaknyapanggilanprogram Andakefungsilibrary.Yaitu,programAndadapat memanggiladd_elementpalingbanyak w kali( w adalahuntuk"writes"), memanggilcheck_elementpalingbanyak r kali( r adalahuntuk"reads"). Rincianimplementasi Andaharusmengimplementasikanfungsi(method): int[]restore_permutation(intn,intw,intr) n:banyaknyabitpadarepresentasibinarydaritiapelemenpadahimpunan (danjugapanjangdari p ). w:banyaknyaoperasiadd_elementmaksimumyangprogramAndadapat lakukan. r:banyaknyaoperasicheck_elementmaksimumyangprogramAnda dapatlakukan. fungsiharusmengembalikanpermutasi p . Fungsilibrary Untukberinteraksidengandatastruktur,programAndaharusmenggunakantiga fungsi(methods)berikutini: voidadd_element(stringx) Fungsiinimenambahkanelemenyangdideskripsikanolehxkedalam himpunan. x:sebuahstringberisikarakter'0'dan'1'memberikanrepresentasi binarydarisebuahbilanganintegeryangakanditambahkanpada himpunan.Panjangdarixharus n . voidcompile_set() Fungsiiniharusdipanggiltepatsekali.ProgramAndatidakdapatmemanggil add_element()setelahpemanggilanini.ProgramAndatidakdapatmemanggil check_element()sebelumpemanggilanini. booleancheck_element(stringx) Fungsiinimengujiapakahelemenxadadalamhimpunanyangtelahdiubah. x:sebuahstringberisikarakter'0'dan'1'memberikanrepresentasi binarydarielemenyangakandiuji.Panjangdarixharus n . mengembalikantruejikaelemenxadadalamhimpunanyangtelah diubah,danfalsejikatidak. 2/4 PerhatikanbahwajikaprogramAndamelanggarsalahsatudaribatasandiatas,hasil gradingakan"WrongAnswer". Untuksetiapstring,karakterpertamamemberikanbitpalingsignifikanuntuk bilanganintegeryangsesuai. Gradermenetapkanpermutasi p sebelumfungsirestore_permutationdipanggil. Gunakanfiletemplateyangsudahdisediakanuntukimplementasirincidaribahasa pemrogramanyangAndapakai. Contoh Gradermelakukanpemanggilanfungsiberikut: restore_permutation(4,16,16).Kitamemiliki n melakukanpalingbanyak 16 "writes"dan 16 "reads". = 4 danprogramdapat Programmelakukanpemanggilanfungsiberikut: add_element("0001") add_element("0011") add_element("0100") compile_set() check_element("0001")mengembalikanfalse check_element("0010")mengembalikantrue check_element("0100")mengembalikantrue check_element("1000")mengembalikanfalse check_element("0011")mengembalikanfalse check_element("0101")mengembalikanfalse check_element("1001")mengembalikanfalse check_element("0110")mengembalikanfalse check_element("1010")mengembalikantrue check_element("1100")mengembalikanfalse Hanyasatupermutasiyangkonsistendengannilai-nilaiyangdikembalikanoleh check_element():permutasi p = [2, 1, 3, 0] .Jadi,restore_permutationharus mengembalikan[2,1,3,0]. Subtasks = 8 , w = 256 , r = 256 , pi ≠ i untukpalingbanyak2indeks i ( 0 ≤ i ≤ n − 1 ), 2. (18poin) n = 32 , w = 320 , r = 1024 , 3. (11poin) n = 32 , w = 1024 , r = 320 , 4. (21poin) n = 128 , w = 1792 , r = 1792 , 5. (30poin) n = 128 , w = 896 , r = 896 . 1. (20poin) n Grader Gradermembacamasukandenganformatberikut: baris1:bilanganinteger n , w , r , baris2: n bilanganintegermemberikanelemen-elemendari p . 3/4 4/4