Hide

Problem F
Lyklaumsjón

Languages en is
/problems/lyklaumsjon/file/statement/is/img-0001.jpg
Mynd eftir [deleted] á /r/programmerhumor

Nú þegar Arnar er komin með nýja rosalega tölvu þá er eins gott að byrja keyra allt sem við kemur keppnunum á henni! Allt verður mikið hraðara og mikið betra!

Hins vegar er ávallt satt að miklum völdum fylgir mikil ábyrgð, svo nú er mikilvægara en nokkru sinni áður að sjá til þess að bara þeir sem hafa réttindi til geti framkvæmt samsvarandi aðgerðir á tölvunni. Til þess er planið að setja upp lyklakerfi sem heldur utan um slíkt.

Tölvan hefur einhverja notendur, upphaflega aðeins notandann ADMIN. Einnig hefur tölvan einhverja lykla, upphaflega aðeins lykilinn ADMINKEY. Loks hefur tölvan ólíkar skipanir sem hægt er að framkvæma. Upphaflega eru þetta aðeins skipanirnar addUser, addKey, addCommand, linkKey, deleteUser, deleteKey, deleteCommand og unlinkKey.

Hver lykill er tengdur einhverjum (mögulega engum) notendum, og hafa þeir notendur réttindin sem sá lykill veitir þeim. Hver lykill er svo einnig tengdur einhverjum (mögulega engum) skipunum. Allir þeir notendur sem hafa þennan lykil geta þá framkvæmt allar tengdar skipanir. Upphaflega er lykillinn ADMINKEY tengdur við notandann ADMIN og allar skipanirnar gefnar að ofan.

Hver skipun tekur einhver möguleg inntök (mögulega engin), öll inntök eru strengir. Eftirfarandi tafla lýsir skipununum gefin að ofan.

Nafn skipunar

Fjöldi inntaka

Lýsing inntaka

addUser

1

Gilt notendanafn

addKey

1

Gilt lyklanafn

addCommand

2

Gilt skipananafn, tala $0 \leq x \leq 8$.

linkKey

3

Nafn lykils, nafn skipunar eða notanda, USER eða COMMAND

deleteUser

1

Nafn notanda

deleteKey

1

Nafn lykils

deleteCommand

1

Nafn skipunar

unlinkKey

3

Nafn lykils, nafn skipunar eða notanda, USER eða COMMAND

Skipunin addUser býr til nýjan notanda með gefna nafnið, addKey eins fyrir lykil. Skipunin addCommand bætir við skipun með gefið nafn og fjöldi inntaka gefið með tölunni eftirá. Þessar skipanir eru ógildar ef notendur, lyklar eða skipanir eru þegar til. Einnig er addCommand ógild ef hún fær eitthvað annað en tölu frá $0$ til $8$ sem annað inntak. Nýjir lyklar, notendur og skipanir hafa engar tengingar við aðra lykla, notendur eða skipanir. Fyrir linkKey verður annað inntak að vera notandi ef það þriðja er USER, en skipun ef þriðja er COMMAND. Öll önnur þriðju inntök eru ógild. Annað inntak er ógilt ef samsvarandi notandi eða skipun er ekki til, eins er fyrsta inntak ógilt ef gefni lykillinn er ekki til. Loks er skipunin einnig ógild ef lykillinn er þegar tengdur.

Hliðstæðu delete aðgerðirnar eru svipaðar nema þær eyða notanda, lykli eða skipun. Ef notandinn, lykillinn eða skipunin er ekki til er aðgerðin ógild. Skipunin unlinkKey virkar eins og linkKey nema hún fjarlægir tengingu, og er þá ógild ef tengingin er ekki þegar til staðar.

Gild notandanöfn mega ekki innihalda bil, enga sérstafi. Aðeins há- og lágstafi. Lengd þeirra má mest vera $16$ stafir. Lyklanöfn eru eins nema mega bara hafa hástafi og mest $10$ stafi. Skipananöfn mega innihalda sérstafi en ekki bil og eru mest $20$ stafir.

Allar skipanir búnar til með addCommand munu ekki gera neitt í okkar kerfi og þurfa að sjá um að skoða inntök sín sjálf, svo þær eru ávallt gildar svo lengi sem þær fá réttan fjölda inntaka og eru framkvæmd af notanda sem er til. Allar skipanir sem eru framkvæmdar af notendum sem eru ekki til eru ógildar. Eins er ógilt að framkvæma skipun sem er ekki til.

Eina sem vantar er forrit sem heldur utan um lykla og skipanir! Þetta forrit þarf að hafna öllum ógildum skipunum og svo hafna öllum skipunum sem eru framkvæmdar af notendum sem hafa ekki réttindin til að framkvæma þær.

Inntak

Fyrsta lína inntaksins inniheldur jákvæða heiltölu $1 \leq n \leq 1\, 000$, fjöldi skipana sem munu fylgja. Hver skipun er á einni línu.

Öll nöfn, inntök og annað innihalda aðeins ASCII stafi og engin bil. Því má skipta hverri línu í orð á bilum. Fyrsta orð hverrar skipunar inniheldur nafn notandans sem er að reyna framkvæma skipunina. Næsta orðið gefur nafn skipuninnar sem notandinn er að reyna framkvæma. Loks fylgir breytilegur fjöldi orða, hver með einu inntaki skipuninnar.

Inntak mun innihalda mest $100\, 000$ stafi og munu allir þeir stafir vera bil, nýlínustafir eða prentanlegir ASCII stafir sem eru ekki bilstafir.

Úttak

Fyrir hverja skipun skal prenta INVALID ef skipunin er ógild. Annars ef hún er gild en notandinn hefur ekki réttindin til að beita skipuninni skal prenta FORBIDDEN. Loks ef allt er í lagi skal prenta ACCEPTED.

Sample Input 1 Sample Output 1
22
ADMIN addUser Arnar
Arnar addUser Atli
ADMIN addUser Konrad
ADMIN linkKey ADMINKEY Konrad USER
Konrad addUser Atli
Konrad addCommand verifyproblem 1
Konrad addKey KFFIKEY
Konrad linkKey KFFIKEY Arnar USER
Konrad linkKey KFFIKEY verifyproblem COMMAND
Arnar verifyproblem keymanagement
Konrad deleteCommand addKey
Konrad deleteCommand addKey
Konrad unlinkKey ADMINKEY deleteKey COMMAND
ADMIN deleteKey KFFIKEY
ADMIN verifyproblem
ADMIN verifyproblem factorialencoding lkeys
ADMIN deleteUser ADMIN
ADMIN deleteUser Konrad
Konrad addCommand verylongcommandthatisnotallowed
Konrad addUser hey!
Konrad addKey newkey
Konrad unlinkKey ADMINKEY addUser command
ACCEPTED
FORBIDDEN
ACCEPTED
ACCEPTED
ACCEPTED
ACCEPTED
ACCEPTED
ACCEPTED
ACCEPTED
ACCEPTED
ACCEPTED
INVALID
ACCEPTED
FORBIDDEN
INVALID
INVALID
ACCEPTED
INVALID
INVALID
INVALID
INVALID
INVALID

Please log in to submit a solution to this problem

Log in