لینک‌های مفید برای شرکت در مسابقه:

راهنمایی‌ها بزودی با زمان‌بندی زیر به پایین صورت سوال‌ها اضافه می‌شود.

  • سری اول: جمعه ۱۵ آذر، ساعت ۱۹. (اضافه شد!)
  • سری دوم: دوشنبه ۱۸ آذر، ساعت ۱۹. (اضافه شد!)

می‌توانید سوالات خود را از قسمت سوال بپرسید مطرح کنید.

حیدری نژادپرست


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

فردا تولد حیدریه!

حیدری دوستانش را خیلی عجیب انتخاب می‌کند به همین دلیل دوستان او یا روس هستند (A) یا سفید (B) یا سیاه (C).

دوستان حیدری به مناسبت تولدش به خانه او آمده‌اند و خودشان به دل‌خواه دور میز دایره‌ای شکل داخل آشپزخانه نشسته‌اند.

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

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

ورودی🔗

در خط اول ورودی nn تعداد دوستان حیدری آمده است. 1n100 0001 \le n \le 100\ 000 سپس در خط دوم ورودی یک رشته به طول nn آمده است متشکل از حروف A، B و C که ترتیب نشستن دوستان حیدری دور میز را نشان می‌دهد. (دقت کنید که میز دایره‌ایست!)

خروجی🔗

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

مثال🔗

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

5
ABABC
Plain text

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

2
Plain text

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

12
ABCABCABCABC
Plain text

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

6
Plain text

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

4
ACBA
Plain text

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

0
Plain text

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

6
BABABA
Plain text

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

2
Plain text

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

9
ABABCBCAC
Plain text

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

3
Plain text

راهنمایی ۱

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

در این حالت نشستن نهایی آن ها ۳! = ۶ حالت دارد. (جایگشت های حروف AA و BB و CC)

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

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

راهنمایی ۲

برای حل سوال در حالت دایره‌ای در هر یک از ۶ حالتی که در بالا توضیح داده شد، تعیین می‌کنیم حرفی که در اول خط آمده است از آخر خط نیز تا کجا آمده است (تفاوت حالت دایره‌ای به حالت خطی این است که ممکن است یک حرف هم اول خط بیاید هم آخر خط؛ چون در حالت دایره‌ای ابتدا و انتهای خط کنار هم قرار می‌گیرد!)

حال اگر برای هر بازه تعداد حروف AA, BB و CC را داشته باشیم زمان حل کم می‌ماند. یک بازه روی دایره را می‌توان با شکاندن دایره و تبدیل آن به خط، به یک بازه و یا اجتماع دو بازه تبدیل کرد.

پس ابتدا دایره را با اعداد ۱ تا nn شماره‌گذاری می‌کنیم. اگر تعداد این حروف را (برای مثال AA) برای زیر رشته ۱ تا هر ii در dp[i]dp[i] داشته باشیم تعداد این حرف در بازه ll تا rr به وضوح از رابطه زیر به دست می‌آید:

    dp[r] - dp[l - 1]
C

روش پر کردن آرایه dpdp هم می‌تواند به صورت زیر باشد:

    for i in 1 -> n:
        dp[i] = dp[i - 1]
        if s[i] == 'A':
            dp[i] = dp[i] + 1
C
ارسال پاسخ برای این سؤال
در حال حاضر شما دسترسی ندارید.