- محدودیت زمان: ۱ ثانیه
- محدودیت حافظه: ۲۵۶ مگابایت
میخواهیم سامانهای برای مدیریت کالج طراحی کنیم. در یک کالج ۳ نوع کاربر باید قابل تعریف باشد. «عضو»، «مربی» و «مدیر». هر کدام از این افراد یک نام کاربری شناسایی میشوند.
بالاترین سطح دسترسی به ترتیب متعلق به «مدیر»، «مربی» و «عضو» است.
هر حساب کاربری بعد از ثبت نام در حالت «غیرفعال» است. زمانی یک حساب فعال میشود که یک «مدیر» آن را فعال کند. همچنین مدیران و مربیها نیاز دارند تا لیست کاربرهایی که «غیر فعال» هستند را داشته باشند.
از شما میخواهیم برنامهای بنویسید که درخواستهای زیر را برآورده کند.
عضویت در سامانه
فرمت کلی این دستورات به صورت زیر است:
REGISTER <USERNAME> <ROLE>
یعنی کاربری با نام <USERNAME> درخواست عضویت با نقش <ROLE> را دارد.
- اگر کاربری با این نام کاربری فعال یا غیرفعالی (با هر نقشی) قبلاً ثبت نام کرده است پیام
INVALID USERNAMEرا چاپ کنید. - اگر
<ROLE>، هیچکدام از مقدارهایADMIN،MENTORیاMEMBERنبود، پیامINVALID ROLEرا چاپ کنید. - در صورتی که هیچ کدام از اتفاقات بالا نیفتاد،
WAITING FOR ACCEPTرا چاپ کنید.
همواره کاربرها بعد از اضافه شدن «غیرفعال» هستند و باید منتظر فعال شدن بمانند.
تایید کردن عضویت
فرمت کلی این دستورات به صورت زیر است:
APPROVE <USERNAME1> <USERNAME2>
یعنی کاربر <USERNAME1> میخواهد کاربر <USERNAME2> را به حالت فعال تبدیل کند.
- اگر کاربری با نام
<USERNAME1>وجود ندارد، پیامINVALID USERNAMEرا چاپ کنید. - اگر کاربر
<USERNAME1>فعال نیست، پیام WAITING FOR ADMINرا چاپ کنید. - اگر کاربر
<USERNAME1>نقشADMINندارد پیام<USERNAME1> IS NOT ADMINرا چاپ کنید. - اگر کاربری با نام
<USERNAME2>وجود ندارد، پیامINVALID USERNAMEرا اعلام کنید. - اگر کاربر
<USERNAME2>اکنون فعال است، پیام<USERNAME2> IS ACTIVEرا چاپ کنید. - در صورتی که هیچ کدام از حالتهای بالا پیش نیامد کاربر
<USERNAME2>را فعال کنید و پیام<USERNAME2> ACTIVATEDرا چاپ کنید.
رد کردن عضویت
REJECT <USERNAME1> <USERNAME2>
یعنی کاربر <USERNAME1> میخواهد کاربر <USERNAME2> را فعال نکند و درخواست عضویت او را پاک کند.
- اگر کاربری با نام
<USERNAME1>وجود ندارد، پیامINVALID USERNAMEرا چاپ کنید. - اگر کاربر
<USERNAME1>فعال نیست، پیام WAITING FOR ADMINرا چاپ کنید. - اگر کاربر
<USERNAME1>نقشADMINندارد، پیامUSERNAME1> IS NOT ADMIN>را چاپ کنید. - اگر کاربری با نام
<USERNAME2>وجود ندارد، پیامINVALID USERNAMEرا اعلام کنید. - اگر کاربر
<USERNAME2>اکنون فعال است، پیامUSERNAME1> IS ACTIVE>را چاپ کنید. - در صورتی که هیچ کدام از حالتهای بالا پیش نیامد کاربر
<USERNAME2>را از لیست انتظار حذف کنید و پیام<USERNAME2> REJECTEDرا چاپ کنید.
صف انتظار تایید
QUEUE <USERNAME>
- اگر کاربری با نام
USERNAMEوجود نداشت، پیامINVALID USERNAMEرا چاپ کنید. - اگر کاربر غیرفعال بود، پیام
WAITING FOR ADMINرا چاپ کنید. - اگر این کاربر نقش
MEMBERداشت، پیامNOT ENOUGH ACCESSرا چاپ کنید. - در صورتی که هیچ کدام از اتفاقات بالا رخ نداد، نام کاربری افرادی که درخواست عضویت دادند و هنوز «غیرفعال» هستند را به ترتیب لغتنامهای (در مقایسهی رشتهها ارزش حروف کوچک و بزرگ را یکسان در نظر بگیرید.) چاپ کنید. اگر هیچ کاربری این وضعیت را نداشت پیام
NO USERرا چاپ کنید.
تغییر نقش
CHANGEROLE <USERNAME1> <USERNAME2> <ROLE>
- اگر کاربری با نام
<USERNAME1>یا<USERNAME2>وجود ندارد، پیامINVALID USERNAMEرا چاپ کنید. - اگر کاربری با نام
<USERNAME1>یا<USERNAME2>غیرفعال است، پیام WAITING FOR ADMINرا چاپ کنید. - اگر
<ROLE>هیچ کدام از سه نقش گفته شده نبود، پیامINVALID ROLEرا چاپ کنید. - اگر نقش
<USERNAME1>پایینتر از<USERNAME2>است یا هردو نقش یکسانی دارند،NOT ENOUGH ACCESSرا چاپ کنید. - اگر نقشی که
<USERNAME1>میخواهد نقش<USERNAME2>را به آن تغییر بدهد، بالاتر از نقش خود اوست (مثلاً خودMENTORاست و میخواهد<USERNAME2>را بهADMINتغییر دهد)،INVALID CHANGEROLEرا چاپ کنید. (تغییر نقش زمانی مجاز است که<USERNAME2>به نقشی پایینتر یا هم تراز<USERNAME1>تغییر پیدا کند). - اگر نقش کاربر با این دسترسی تغییری نمیکند، پیام
ALREADY HAS THIS ROLEچاپ کنید. - در صورتی که هیچ کدام از تغییرات بالا اتفاق نمیافتد، نقش
USERNAME2را بهROLEتغییر دهید و پیامROLE CHANGED SUCCESSFULLYرا چاپ کنید.
وضعیت کاربر
STATUS <USERNAME>
نام کاربری، نقش و فعال بودن آن را با این الگو چاپ کنید:
اگر کاربری با نام <USERNAME> وجود ندارد، پیام INVALID USERNAME را چاپ کنید.
اگر کاربر فعال است:
username: <USERNAME> role: <ROLE> active
در غیر این صورت:
username: <USERNAME> role: <ROLE> not active
نکات
- توجه کنید در هر دستور باید فقط یک پیام چاپ کنید و اگر چند حالت باهم پیش آمد شرایطی که زودتر بیان شده بود، الویت دارد.
- هر رشتهای که در ورودی داده میشود، شامل حروف کوچک و بزرگ انگلیسی به طول حداقل ۱ و حداکثر ۱۰ کاراکتر است.
- در ابتدا یک کاربر با نام کاربری
ADMINو نقشADMINبه صورت فعال در سامانه وجود دارد.
ورودی
در سطر اول ورودی، عدد صحیح و مثبت $n$ داده میشود که تعداد دستورها را نشان میدهد.
$$1 \leq n \leq 10 , 000$$
در $n$ سطر بعدی، در هر سطر یکی از دستورهایی که در بالا تعریف شده، داده میشود.
خروجی
برای هر دستور، خروجی مورد نظر را چاپ کنید. تضمین میشود ورودیها طوری داده شود که مجموع کاراکتر خروجیها از $10^6$ بیشتر نشود.
مثال
ورودی نمونه ۱
21
REGISTER Amin ADMIN
REGISTER Mitra MENBER
REGISTER Mitra MEMBER
REGISTER Amin MEMBER
QUEUE ADMIN
APPROVE Amin Mitra
APPROVE ADMIN Mitra
APPROVE Mitra Amin
REGISTER Amir MEMBER
REJECT Amir Amin
APPROVE ADMIN Amin
APPROVE Mitra Amir
CHANGEROLE Amin Mitra MENTOR
STATUS Mitra
APPROVE Amin Amir
QUEUE Amir
REGISTER Mina MENTOR
CHANGEROLE Mitra Amir MENTOR
QUEUE Mitra
CHANGEROLE Mitra Amir MEMBER
STATUS Mina
خروجی نمونه ۱
WAITING FOR ACCEPT
INVALID ROLE
WAITING FOR ACCEPT
INVALID USERNAME
Amin Mitra
WAITING FOR ADMIN
Mitra ACTIVATED
Mitra IS NOT ADMIN
WAITING FOR ACCEPT
WAITING FOR ADMIN
Amin ACTIVATED
Mitra IS NOT ADMIN
ROLE CHANGED SUCCESSFULLY
username: Mitra role: MENTOR active
Amir ACTIVATED
NOT ENOUGH ACCESS
WAITING FOR ACCEPT
ROLE CHANGED SUCCESSFULLY
Mina
NOT ENOUGH ACCESS
username: Mina role: MENTOR not active
ارسال پاسخ برای این سؤال