گردهمایی


  • محدودیت زمان: ۱ ثانیه
  • محدودیت حافظه: ۶۴ مگابایت

کریم یک کودک ۵ ساله است و در گردهمایی مهدکودکی‌ها شرکت می‌کند.

کریم و n1n - 1 نفر از هم مهدی‌هایش دور یک میز دایره‌ای شکل جهت صرف دوغ گرد هم آمده‌اند. آن‌ها را با شروع از کریم و بصورت ساعتگرد، با اعداد 1 تا nn شماره‌گذاری می‌کنیم. بین برخی از این کودکان رابطه‌ی دوطرفه‌ی دوستی برقرار است.

پس از انتظارهای بسیار، یک عدد پارچ دوغ به کنار میز آورده می‌شود. همه‌ی این nn نفر می‌خواهند از این دوغ بنوشند. روند دوغ‌رسانی در این قبیل گردهمایی‌ها به این صورت است که پارچ دوغ ابتدا به یکی از افراد دور میز داده می‌شود. هرکسی که پارچ به دستش میرسد پس از نوشیدن مقداری از آن، پارچ دوغ را به یکی از دوستانش که هنوز دوغ نخورده است می‌دهد تا وقتی که همه از آن بنوشند. دقت کنید که بخاطر سن کم، هیچ کس پارچ دوغ را به کسی که با او دوست نیست نمی‌دهد.

به دلیل بزرگ بودن میز و کوچک بودن کودکان، هرکس برای رساندن دوغ به نفر بعدی به روی میز میرود و هنگام راه رفتن روی مسیر بین جایگاه نشستن خود و نفر بعدی، خطی از دوغ روی میز باقی می‌گذارد. روی هیچ نقطه‌ای از مسیری که یک کودک به سمت کودک بعدی طی می‌کند نباید از قبل دوغی ریخته شده باشد؛ چون کودک هنگام حمل دوغ لیز خورده و خاطره‌ی بدی از گردهمایی بجا خواهد ماند.

حال با دانستن روابط دوستی بین این کودکان، بگویید که این ها به چه ترتیبی می‌توانند دوغ بخورند که به همه دوغ برسد و هیچکس هنگام حمل دوغ زمین نخورد. (یا بگویید که امکان ندارد.)

ورودی🔗

خط اول ورودی شامل عدد nn است.

در خط دوم ورودی عدد mm که بیانگر تعداد رابطه های دوستی بین کودکان است. هریک از mm خط بعدی یک جفت عدد u,vu, v آمده که یعنی کودک شماره uu و کودک شماره vv با هم دوست هستند.

3n10003 \le n \le 1000

0mn×(n1)20 \le m \le \frac{n \times (n-1)}2

خروجی🔗

اگر امکان ندارد که به همه با شرایط گفته شده دوغ برسد، تنها خط خروجی باید شامل عدد 1-1 باشد. در غیر این صورت خروجی برنامه باید ترتیبی صحیح از دوغ خوردن افراد باشد که در nn خط آمده است.

در صورت وجود چند ترتیب درست، یکی را به دلخواه خروجی دهید.

ورودی نمونه ۱🔗

7
9
1 4
5 1
1 7
5 6
2 3
3 4
2 6
4 6
6 7
Plain text

خروجی نمونه ۱🔗

2
3
4
1
7
6
5
Plain text

ورودی نمونه ۲🔗

4
3
1 2
2 4
1 3
Plain text

خروجی نمونه ۲🔗

-1
Plain text

ترتیب ابیات


  • محدودیت زمان: ۱ ثانیه
  • محدودیت حافظه: ۲۵۶ مگابایت

کیانوش متقاضی عضویت در سازمان OC است. در روز سوم مصاحبه، سازمان ادبیات او را مورد بررسی قرار داده است.

در این مصاحبه، پنچ نفر روبروی کیانوش مینشینند. آن‌ها شعری انتخاب کرده‌اند. هریک از آن‌ها یکبار ابیات آن شعر را به هم میریزد و با ترتیبی تصادفی به کیانوش میگوید؛ به این صورت که ابتدا شعر انتخاب شده‌ی اولیه را درنظر گرفته و سپس تعدادی از ابیات آنرا انتخاب کرده، از شعر حذف میکند و در جای دیگری به شعر اضافه میکند. کیانوش باید ترتیب ابیات در شعر اصلی را بیابد. میدانیم که هر بیت در حداکثر یکی از این ۵ شعر حذف و جابجا شده است.

هنگام به‌هم ریختن ابیات، بیت‌ها پس از حذف شدن به ترتیب دلخواه و در جایگاه دلخواه اضافه میشوند. ممکن است جایگاه ابیات حذف نشده نیز در این حرکت تغییر کند.

با ورودی گرفتن ابیات خوانده شده بگویید که ترتیب اولیه چه بوده است. تضمین میشود که در ورودی‌های داده‌شده ترتیب اولیه بصورت یکتا مشخص میشود.

ورودی🔗

سطر اول ورودی تنها شامل عدد nn است که نمایانگر تعداد ابیات داخل شعر خوانده شده است.

سپس در 5n5n سطر بعدی، پنج بار و هر بار در nn سطر و در هر سطر یک بیت از شعر آمده است. ابیات را با اعداد صحیح متمایز بین ۰ و 10910^9 مشخص میکنیم.

1n200001 \le n \le 20000

خروجی🔗

خروجی برنامه باید شامل nn سطر باشد که هر سطر شامل یک بیت از شعر بشود. ترتیب ابیات باید برابر ترتیب انتخاب شده‌ی اولیه باشد.

ورودی نمونه🔗

5
1
2
3
4
5
2
1
3
4
5
3
1
2
4
5
4
1
2
3
5
5
1
2
3
4
Plain text

خروجی نمونه🔗

1
2
3
4
5
Plain text

در این مثال هر فرد قبل از خواندن شعر یک بیت را از آن حذف کرده و به ابتدای شعر منتقل میکند و سپس آن را میخواند؛ پس هر بیت در حداکثر یک شعر جابجا شده است.

فشرده‌سازی


  • محدودیت زمان: ۱ ثانیه
  • محدودیت حافظه: ۲۵۶ مگابایت

عمو که فردی بسیار پول پرست است، جهت صرفه‌جویی در تعداد حروف پیامک‌هایش به فشرده‌سازی رشته‌ها روی آورده.

روش عمو برای فشرده‌سازی به این صورت است:

که او در ابتدا جایگشتی از اعداد ۱, ۲, ..., kk انتخاب میکند. سپس رشته‌ی خود را به دسته های پشت سر هم kk حرفی تقسیم میکند (طول رشته باید به kk بخش‌پذیر باشد) و روی هر دسته از حروف، جایگشت خود را اعمال میکند. سپس رشته‌ی بدست آمده را بوسیله‌ی روش RLE که در ادامه توضیح داده خواهد شد، فشرده میکند.

اعمال جایگشت pp روی یک دسته از kk حرف یعنی حرف p1p_1م را در جایگاه اول قرار داده، حرف p2p_2م را در جایگاه دوم و... برای مثال اعمال جایگشت {۲ ,۴ ,۱ ,۳} روی رشته‌ی abcdabcd آن را تبدیل به cadbcadb میکند. اعمال این جایگشت با دسته دسته کردن روی رشته‌ی abcdefghabcdefgh، رشته‌ی cadbgehfcadbgehf را نتیجه میدهد.

رشته‌ی جایگشت داده شده توسط RLE (یا run-length encoding) فشرده میشود. جهت جلوگیری از محاسبات پیچیده، طول رشته‌ی فشرده‌شده را برابر تعداد گروه حرف‌های برابر پشت سر هم درنظر میگیریم. برای مثال طول رشته‌ی aabcaaaabcaa پس از فشرده‌شدن توسط RLE را ۴ در نظر میگیریم. (یک گروه ۲ حرفی a، یک گروه تک حرفی b، یک گروه تک حرفی c و یک گروه ۲ حرفی a)

عمو میخواهد پیامکی را با روش گفته شده فشرده کرده و بفرستد. واضح است که طول رشته‌ی نهایی به جایگشت انتخاب‌شده مربوط است. شما با داشتن متن پیامک عمو، جایگشتی انتخاب کنید که پس از فشرده‌سازی بوسیله‌ی آن طول پیامک کمینه شود و این طول کمینه را خروجی دهید.

ورودی🔗

سطر اول تنها شامل عدد kk است.

در سطر بعدی پیامک عمو بصورت یک رشته از حروف کوچک انگلیسی به طول حداکثر ۵۰۰۰۰ آمده است.

2k162 \le k \le 16

خروجی🔗

در تنها سطر خروجی یک عدد چاپ کنید که برابر کمترین طول ممکن برای پیامک عمو است.

ورودی نمونه🔗

4
abcabcabcabc
Plain text

خروجی نمونه🔗

7
Plain text

در این مثال با انتخاب جایگشت {۲ ,۳ ,۴ ,۱} نتیجه‌ی بهینه بدست می‌آید.

هری پاتر


انجام دادن تکالیف معمولاً موجب می‌شود دانش‌آموزان درک عمیق‌تری نسبت به درس داشته باشند. هری پاتر به عنوان یکی از دانش‌آموزان هاگوارتز، خیلی وقت‌ها تکالیف زیادی را باید انجام دهد. او هر روز، به عنوان تکلیف، یک مجموعه مسئله از استادانش می‌گیرد. مسئله‌ی ii به اندازه‌ی tit_i زمان لازم دارد تا کامل انجام شود. با فرض داشتن یک برنامه (یا به عبارت دیگر یک ترتیب از مسئله‌ها)، هر مسئله‌ی ii یک «زمان پایان»ای دارد که آن را با CiC_i نمایش می‌دهیم. برای مثال اگر مسئله‌ی jj اولین مسئله‌ای باشد که حل می‌شود آنگاه زمان پایان آن برابر Cj=tjC_j=t_j است. هر مسئله‌ی ii همچنین یک «وزن» مشخص‌شده‌ی WiW_i دارد که اهمیت آن مسئله را در ایجاد تسلط بر دانش مربوطه نشان می‌هد. هری می‌خواهد مسئله‌هایش را طوری مرتب کند که جمع وزن‌دار زمان پایان مسئله‌ها یعنی W1×C1+W2×C2++Wn×CnW_1\times C_1+W_2 \times C_2+\ldots +W_n\times C_n کمینه شود. برنامه‌ای بنویسید که با گرفتن مجموعه‌ای از nn مسئله و هزینه‌ی زمانی هرمسئله (tit_i) و وزنش (WiW_i) کمترین مقدار ممکن را برای جمع وزن‌دار زمان پایان‌ها یعنی i=1nWiCi \sum_{i=1}^{n} W_i*C_i پیدا کند.

برای مثال فرض کنید دو مسئله داریم: مسئله‌ی اول به اندازه‌ی t1=2t_1=2 زمان می‌برد و وزن آن w1=12w_1=12 است و مسئله‌ی دوم به اندازه‌ی t2=3t_2=3 زمان می‌برد و وزن آن w2=4w_2=4 است. در این صورت، اگر مسئله‌ی اول ابتدا حل شود مجموع وزن‌دار زمان‌ها 12×2+4×5=4412 \times 2+4 \times 5=44 می‌شود و اگر مسئله‌ی دوم ابتدا حل شود، مجموع وزن‌دار برابر 4×3+12×5=724 \times 3+12 \times 5=72 می‌شود که به وضوح کمترین مقدار مجموع وزن‌دار زمان‌ها برابر 4444 است.

محدودیت‌ها🔗

1n20000 1 \leq n \leq 20000 1ti,Wi,10000 1 \leq t_i, W_i, \leq 10000

  • زبان C و C++
    • محدودیت زمان: ۵۰۰ میلی‌ثانیه
    • محدودیت حافظه: ۱۵۰ مگابایت
  • زبان پایتون و جاوا
    • محدودیت زمان: ۱۲۵۰ میلی‌ثانیه
    • محدودیت حافظه: ۲۰۰ مگابایت

ورودی🔗

در خط اول ورودی nn آمده است که تعداد مسئله‌ها را نشان می‌دهد. در هر یک از nn خط بعد دو عدد tit_i و WiW_i که به ترتیب زمان حل شدن و وزن مسئله است آمده است.

خروجی🔗

در تنها سطر خروجی فقط یک عدد صحیح بنویسید که نشان‌دهنده‌ی کمترین مقدار ممکن برای مجموع وزن‌دار زمان پایان‌ها مسئله‌ها باشد.

مثال🔗

نمونه ورودی🔗

2
2 12
3 4
Plain text

نمونه خروجی🔗

44
Plain text

شهر زنبورها


شهر زنبورها بر روی یک شاخه از یک درخت تنومند ساخته شده است. این شهر از nn ستون کنار هم تشکیل شده که آن‌ها را به ترتیب از ۱ تا nn شماره‌گذاری کرده‌ایم. در هر ستون تعدادی کندو وجود دارد، به طوری که کندوی اول به شاخه متصل است و کندوهای بعدی هر کدام به کندوی بالایی خود متصلند. در نتیجه هر ستون ارتفاعی دارد که آن را با hih_i نمایش می‌دهیم. (تعداد کندوهایی که در آن ستون وجود دارد)

ملکهٔ زنبورها برای کاهش ضرر در حمله‌ٔ خرس‌ها به تازگی دست به کار شده و گروهی را به سردستگی «هاچ زنبور عسل» مسئول این کار کرده است. در حملهٔ یک خرس به شهر زنبور‌ها، خرس تا جایی که می‌تواند می‌پرد و در نتیجه تمام کندوهایی که دستش به آنها می‌رسد را می‌کند؛ ضرر یک حمله برابر تعداد کندوهایی است که خرس کنده است. در نتیجه هاچ باید کاری کند که در حملهٔ یک خرس کمترین تعداد کندو در دسترس خرس باشد.

در هر حرکت هاچ و دستهٔ زنبورها می‌توانند یک کندو از پایین‌ترین جا در یک ستون را بردارند و به پایین‌ترین کندو در یکی از دو ستون مجاور متصل کنند؛ دقت کنید که تنها می‌توان در ستون‌های ۱ تا nn کندویی اضافه کرد. دراین صورت ارتفاع این ستون یکی کم شده و به ارتفاع ستونی که کندو در آن قرار داده شده، یک واحد اضافه می‌شود. به دلیل حجم زیاد کار و کمبود زمان هاچ می‌خواهد در کمترین تعداد حرکت، با جابجا کردن کندوها به شیوهٔ گفته شده کاری کند که در حملهٔ یک خرس کمترین خسارت ممکن به شهر وارد شود.

شما باید به دست آورید کمترین تعداد حرکت برای اینکه هاچ این کار را انجام دهد چقدر است. برنامه‌ای بنویسید که تعداد و ارتفاع ستون‌های شهر را از ورودی بخواند و کمترین تعداد حرکت برای اینکه هاچ ضرر را به حداقل برساند را در خروجی بنویسد.

محدودیت‌ها🔗

1n1000 1 \leq n \leq 1000 1hi106 1 \leq h_i \leq 10^6

  • زبان C و C++
    • محدودیت زمان: ۱ ثانیه
    • محدودیت حافظه: ۱۵۰ مگابایت
  • زبان پایتون و جاوا
    • محدودیت زمان: ۲ ثانیه
    • محدودیت حافظه: ۲۰۰ مگابایت

ورودی🔗

سطر نخست ورودی شامل یک عدد صحیح است: nn که تعداد ستون‌های یک شهر را مشخص می‌کند. سطر بعدی محتوی nn عدد صحیح می‌باشد؛ عدد iiاُم نشان‌دهندهٔ ارتفاع ستون iiاُم (hih_i) است.

خروجی🔗

در تنها سطر خروجی یک عدد که نشانگر کمترین تعداد حرکات لازم می‌باشد بنویسید.

مثال🔗

نمونه ورودی🔗

5
4 1 1 2 2
Plain text

نمونه خروجی🔗

3
Plain text

نردبان الفبایی


نردبان کلمات یک دنباله از کلمات است که که هر دو تا کلمه‌ی پشت‌سر‌هم صرفا فقط در یک حرف تفاوت داشته باشند.. یک مثال از این نردبان کلمات (‌البته به صورت افقی نوشته‌ایم!!) می‌تواند todo,food,wood,word,downtodo, food, wood, word, down باشد. توجه کنید که حروف دو کلمه‌ی پشت‌سر‌هم می‌تواند جابه‌جا شود ولی دقیقا یک حرف باید تغییر کند. برای این مسئله به شما یک فرهنگ لغات از کلمات مختلف داده می‌شود که همگی طولشان یکسان است. شما باید یک برنامه بنویسید که کوتاه‌ترین نردبان از کلمات را بیابد که کلمه‌ی اول و کلمه‌ی آخر آن هیچ حرف یکسانی نداشته باشد.

توجه🔗

اگر ss و tt دو رشته از حروف باشند، که تعداد حروفشان یکسان است و sis_i حرف iiام رشته‌ی ss را نشان دهد آنگاه گوییم ss از tt به صورت الفبایی کوچکتر است اگر برای یک ii داشته باشیم si<tis_i < t_i و برای تمام j<ij<i داشته باشیم sj=tjs_j=t_j

محدودیت‌ها🔗

1n100 1 \leq n \leq 100 1l20 1 \leq l \leq 20

  • زبان C و C++
    • محدودیت زمان: ۱ ثانیه
    • محدودیت حافظه: ۱۵۰ مگابایت
  • زبان پایتون و جاوا
    • محدودیت زمان: ۲.۵ ثانیه
    • محدودیت حافظه: ۲۰۰ مگابایت

ورودی🔗

سطر نخست ورودی شامل دو عدد صحیح به ترتیب nn و ll می‌باشد که نشان‌دهنده‌ی تعداد کلمات فرهنگ لغات و طول هر کدام می‌باشد. در هر کدام از nn سطر بعد یک کلمه با حروف aza-z به طول ll آمده است.

خروجی🔗

در تنها سطر خروجی کوچکترین نردبان الفبایی با شرایط خواسته شده را چاپ کنید و بین هر دو کلمه‌ی پشت سر هم فاصله چاپ کنید. ورودی به گونه‌ای داده می‌شود که تضمین شود حتما نردبان خواسته شده وجود دارد و اگر چندین نردبان با طول یکسان وجود داشت، نردبانی را انتخاب کنید که با توجه به تعریف داده شده به صورت الفبایی کوچکتر باشد.

مثال🔗

نمونه ورودی🔗

9 3
alt
spy
sea
opt
pea
ape
spa
apt
ale
Plain text

نمونه خروجی🔗

ale alt apt opt
Plain text

کتیبه‌ی باستانی


در يک منطقه‌ى اروپايى باستان‌شناسان اخيراً نسخى خطى را يافته‌اند که فهم متن کتیبه، برای آن‌ها دستیابی به فرهنگ منطقه حیاتی ارزیابی شده است. در رمزگشايى بخش نوشتارى اين کتيبه‌ها دانشمندان با چالشى جدى مواجه شده‌اند. علاوه‌بر اين‌که نمى‌دانند کتيبه به چه زبانى نوشته شده، بعضى حروف آن طى زمان از بين رفته و قابل تشخيص نيست. يکى از دانشمندان با مطالعه‌ى کتيبه زبانى را به خاطر آورده که در آن حداکثر VCV_C حرف صدادار پشت‌سرهم و CCC_C حرف بى‌صداى متوالى ممکن است بيايد. همچنين در اين زبان حداکثر VEV_E حرف صدادار متوالى مى‌توانند يکسان باشند و نيز CEC_E حرف بى‌صداى متوالى. اين دانشمند براى کسب اطلاعات بيشتر در مورد اين زبان گروه را ترک کرده است. ديگران سعى دارند که تا بازگشت او کتيبه‌ها را بررسى کرده و ببينند که آيا با نظريه‌ى دانشمند تناقض دارد يا خير. آن‌ها مى‌خواهند که درصورت سازگارى نظريه با کتيبه‌ها ميزان کار پيشروى خود را تخمين بزنند. به عبارت ديگر، مى‌خواهند بدانند که متن را به چند صورت مى‌توان به صورت سازگار با نظريه رمزگشايى کرد. از شما براى کمک در اين کار دعوت رسمى به‌عمل آمده است. حروف مورد استفاده در اين کتيبه‌ها، بر حسب اتفاق، همان حروف کوچک الفباى انگليسى است. از بين آن‌ها حروف "aeiou" حروف صدادار هستند.

محدودیت‌ها🔗

1VEVC4 1 \leq V_E \leq V_C \leq 4 1CECC4 1 \leq C_E \leq C_C \leq 4

  • زبان C و C++
    • محدودیت زمان: ۱ ثانیه
    • محدودیت حافظه: ۱۵۰ مگابایت
  • زبان پایتون و جاوا
    • محدودیت زمان: ۲.۵ ثانیه
    • محدودیت حافظه: ۲۰۰ مگابایت

ورودی🔗

سطر اول ورودی چهار عدد صحيح CC,CE,VC,VEC_C, C_E, V_C, V_E به ترتیب آمده‌اند. سطر دوم شامل يک کلمه از کتيبه است و حروف ناخواناى آن با * نشان داده شده است. هر کلمه از کتیبه حداکثر ۱۵ حرف است.

خروجی🔗

يک عدد صحيح در آن بنويسيد که تعداد روش‌هايى است که مى‌توان کلمه‌ى ورودى را با توجه به شرايط مذکور ساخت. فرض کنيد که پاسخ همواره در عدد صحيح علامت‌دار ۶۴ بیتی جای می‌گیرد.

مثال🔗

نمونه ورودی ۱🔗

1 1 1 1
a**
Plain text

نمونه خروجی ۱🔗

105
Plain text

نمونه ورودی ۲🔗

1 1 1 1
b*i
Plain text

نمونه خروجی ۲🔗

0
Plain text

نمونه ورودی ۳🔗

1 2 1 2
ancient
Plain text

نمونه خروجی ۳🔗

1
Plain text

نمونه ورودی ۴🔗

4 4 4 4
man****ipt
Plain text

نمونه خروجی ۴🔗

261870
Plain text

زیررشته


رشته‌ي ss و عدد mm و kk به شما داده شده است. از بین زیررشته‌های به طول mm اولین زیررشته‌ای که حداقل kk بار آمده است را پیدا کنید.

ورودی🔗

رشته‌ي ss و عدد mm و kk

خروجی🔗

مکان اولین زیررشته‌ی خواسته شده را در خروجی چاپ کنید. درصورتی که چنین زیررشته‌ای وجود نداشت، NoSolution چاپ کنید.(اندیس رشته از صفر شروع می‌شود)

محدودیت‌ها🔗

s<106|s| < 10^6

مثال🔗

ورودی نمونه

‪uvklkjwqiosqpiucplkjwqpqwzvbiwlkjwq‬‬‫‪rtashgdfjdfsjshiertq‬‬
5 3
Plain text

خروجی نمونه

3
Plain text

حذف ارقام


خانم دکتر دنباله‌ای از اعداد طبیعی دارد. همان‌طور که می‌دانید دکتر‌ها برعکس مهندس‌ها از صعودی‌بودن دنباله‌ها لذت می‌برند ولی بلد نیستند دنباله‌هایشان را صعودی کنند. برای همین خانم دکتر از آقای مهندس خواسته‌است تا دنباله‌اش را برایش صعودی کند. (منظور از دنباله‌‌ی صعودی دنباله‌ای است که هیچ عضوی از آن از عضو قبلی‌اش کمتر نیست) آقای مهندس در هر حرکت می‌تواند یکی از ارقام یکی از اعداد دنباله را حذف کند. دقت کنید که وقتی تمامی ارقام یکی از اعداد دنباله را حذف کنیم مقدارش صفر خواهد شد.

او به عنوان یک مهندس مجبور است در کم‌ترین تعداد حرکت دنباله‌ را صعودی کند. این کم‌ترین تعداد حرکت چقدر است؟ هم‌چنین او می‌خواهد جمع اعداد دنباله‌ی نهایی که با کمترین تعداد حرکات به آن می‌رسد کمینه باشد. (در عین استفاده از کمترین تعداد حرکت) این مجموع کمینه را نیز پیدا کنید.

ورودی🔗

سطر اول ورودی شامل عدد طبیعی nn، تعداد اعداد دنباله، است.

در سطر بعد nn عدد طبیعی aia_i آمده‌است که اعداد دنباله را نشان می‌دهند.

  • 1n500001\leq n \leq 50000

  • 1ai10181\leq a_i \leq 10^18

  • هیچ کدام از اعداد دنباله رقم 00 ندارند.

خروجی🔗

در سطر اول خروجی کمترین تعداد حرکت برای صعودی کردن دنباله را چاپ کنید.

در سطر دوم nn عدد چاپ کنید که اعداد دنباله نهایی را نشان می‌دهند که هم باید صعودی باشند و هم مجموع‌شان کمینه شود. در صورت وجود چندین جواب هر کدام از آن‌ها را می‌توانید چاپ کنید.

مثال🔗

ورودی نمونه ۱

4
63 54 45 36
Plain text

خروجی نمونه ۱

3
3 4 4 36
Plain text

ورودی نمونه ۲

6
8 16 16 1393 6 19 
Plain text

خروجی نمونه ۲

6
0 1 1 1 6 19
Plain text

۲۴امین دوره‌ المپیاد کامپیوتر - آزمون هفتم - ۱۳۹۳/۰۶/۱۹

رمزنگاری


موضوع امنیت در اینترنت یکی از مهم‌ترین موضوع‌های مورد مطالعه‌ی سال‌های اخیر است. یکی از روش‌های امنیت، رمزنگاری داده‌ها است. الگوریتم «پفکی» یکی از پرکاربردترین روش‌ها برای رمزنگاری است. این الگوریتم برای رمزنگاری داده‌ها، از دو دنباله‌ی a0,a1,,an1a_0,a_1,\cdots,a_{n-1} و b0,b1,,bn1b_0,b_1,\cdots,b_{n-1} استفاده می‌کند. میزان امنیت الگوریتم «پفکی» با استفاده از روش زیر قابل محاسبه است:

«جدولی با nn سطر و 32×m32 \times m ستون در نظر بگیرید که در خانه‌ی (i,j)(i,j) (0in1,0j32×m1)(0 \leq i \leq n-1 , \, 0 \leq j \leq 32 \times m-1) از آن getBit(aibj32,jmod32)getBit(a_i \bigoplus b_{\lfloor \frac{j}{32} \rfloor}, j \, mod \, 32) نوشته شده است. در این‌جا تابع getBit(x,p)getBit(x,p) بیت ppام از عدد xx را برمی‌گرداند، برای مثال getBit(6,0)=0getBit(6,0) = 0 و getBit(6,1)=1getBit(6,1) = 1 و getBit(6,2)=1getBit(6,2) = 1 هستند. تمام جدول‌هایی که از جدول ساخته شده با جابه‌جایی ستون‌ها می‌توان ساخت را در نظر بگیرید(حداکثر 32m!32m! جدول متفاوت) و به ازای هر کدام از این جدول‌ها اندازه‌ي بزرگترین زیر جدولی (بزرگترین از لحاظ تعداد خانه‌های تشکیل دهنده) که تمام خانه‌هایش ۱ است را محاسبه کنید. بیشینه اعداد محاسبه شده برابر با میزان امنیت الگوریتم پفکی به ازای ورودی‌های a0,a1,,an1a_0,a_1,\cdots,a_{n-1} و b0,b1,,bn1b_0,b_1,\cdots,b_{n-1} است. دقت کنید که تنها جابه‌جایی ستون‌ها مجاز است و جابه‌جایی سطر‌ها مجاز نیست.»

شما باید برنامه‌ای بنویسید که باتوجه به ورودی‌های الگوریتم پفکی، میزان امنیت آن را مشخص کند.

علامت \bigoplus نشان‌دهنده عملگر xorxor است. عبارت amodba\, mod\, b نیز نشان‌دهنده باقی مانده عدد aa بر bb است.

ورودی🔗

در سطر اول ورودی به ترتیب دو عدد طبیعی nn و mm آمده است.

در سطر دوم nn عدد صحیح آمده است که عدد iiام (1in)(1\leq i \leq n) آن نشان‌دهنده‌ي ai1a_{i-1} است.

در سطر سوم mm عدد صحیح آمده است که عدد iiام (1im)(1 \leq i \leq m) آن نشان‌دهنده‌ی bi1b_{i-1} است.

خروجی🔗

در تنها سطر خروجی میزان امنیت روش پفکی را به ازای دنباله‌هایی که در ورودی آمده است، چاپ کنید.

محدودیت‌ها🔗

  • 1n,m1061 \leq n,m \leq 10^6
  • 0ai,bi230 0 \leq a_i,b_i \leq 2^{30}

مثال🔗

ورودی نمونه ۱

2 2
1 2
1 2
Plain text

خروجی نمونه ۱

2
Plain text

ورودی نمونه ۲

4 4
1 3 2 10
4 1 7 15
Plain text

خروجی نمونه ۲

16
Plain text

۲۵امین دوره المپیاد کامپیوتر - آزمون نهایی اول - ۱۳۹۴/۶/۱۸