- محدودیت زمان: ۱ ثانیه
- محدودیت حافظه: ۲۵۶ مگابایت
میخواهیم سامانهای برای مدیریت کالج طراحی کنیم. در یک کالج ۳ نوع کاربر باید قابل تعریف باشد. «عضو»، «مربی» و «مدیر». هر کدام از این افراد یک نام کاربری شناسایی میشوند.
بالاترین سطح دسترسی به ترتیب متعلق به «مدیر»، «مربی» و «عضو» است.
هر حساب کاربری بعد از ثبت نام در حالت «غیرفعال» است. زمانی یک حساب فعال میشود که یک «مدیر» آن را فعال کند. همچنین مدیران و مربیها نیاز دارند تا لیست کاربرهایی که «غیر فعال» هستند را داشته باشند.
از شما میخواهیم برنامهای بنویسید که درخواستهای زیر را برآورده کند.
عضویت در سامانه
فرمت کلی این دستورات به صورت زیر است:
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
ارسال پاسخ برای این سؤال