همینگطوری


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

ما یک رشته‌ی mm بیتی داریم (یعنی تمام کاراکترهای آن 0 و 1 هستند) به صورت a1,a2,,ama_1, a_2, \dots, a_m\, و این رشته را با استفاده از کدگذاری همینگ (HammingCodeHamming \,Code) کدگذاری کرده‌ایم.

Richard Hamming

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

یکی از کاربردهای کدگذاری همینگ این است که در فرآیند انتقال داده، اگر حداکثر یک بیت تغییر کند، می‌توان با استفاده از این کدگذاری خطا را شناسایی و در صورت امکان اصلاح کرد.

در روش کدگذاری همینگ، اگر mm تعداد بیت‌های رشته‌ی اصلی و rr تعداد بیت‌های توازن باشد، شرط زیر باید برقرار باشد: 2rm+r+1 2^r \geq m + r + 1

برای محاسبه‌ی rr، کوچک‌ترین عدد طبیعی را انتخاب می‌کنیم که این رابطه را ارضا کند.
برای مثال، اگر m=11m = 11 باشد، مقدار r=4r = 4 خواهد بود.

سپس رشته‌ی جدیدی به طول n=m+rn = m + r (شامل بیت‌های اصلی و بیت‌های توازن) به صورت b1,b2,,bnb_1, b_2, \dots, b_{n} می‌سازیم. بیت‌های توانی از ۲ (1,2,4,8,1, 2, 4, 8, \dots) برای بیت‌های توازن رزرو می‌شوند و باقی بیت‌ها به ترتیب از رشته‌ی اصلی پر می‌شوند.

برای مثال، اگر m=11m = 11 و رشته‌ی اصلی برابر 01010111010 باشد، رشته‌ی جدید به صورت ??0?101?0111010 ساخته می‌شود.

در مرحله‌ی بعد، مقدار هر بیت توازن b2ib_{2^i} (ii از 00 تا r1r-1) را به صورت یای‌انحصاری (XORXOR) بیت‌هایی از رشته‌ی bb که در موقعیت‌های باینری آن‌ها بیت ii برابر ۱ است، محاسبه می‌کنیم.

یک رشته‌ی nn بیتی به ما داده شده که طبق کدگذاری همینگ ساخته شده است. از شما خواسته می‌شود که بررسی کنید آیا رشته دارای خطا است یا خیر و اگر رشته دقیقاً یک خطا دارد، موقعیت خطا را شناسایی و رشته را اصلاح کنید و اگر رشته معتبر نباشد (مثلاً بیش از یک خطا داشته باشد)، INVALID چاپ کنید.

ورودی🔗

در خط سطر اول ورودی، عدد صحیح tt آمده که تعداد تست‌ها را نشان می‌دهد.

1t1000 1 \leq t \leq 1000

در سطر اول هر تست، یک عدد صحیح nn آمده که طول رشته‌ی باینری کدگذاری شده را نشان می‌دهد. 2n100,000 2 \leq n \leq 100,000

در سطر دوم هر تست، یک رشته‌ی باینری nn بیتی شامل کاراکترهای 0 و 1 داده می‌شود که کاراکترهای رشته‌ی کدگذاری شده را به‌ترتیب نشان می‌دهد.

تضمین می‌شود مجموع مقادیر nn در تمام تست‌کیس‌ها از 1,000,0001,000,000 بیشتر نخواهد شد.

خروجی🔗

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

مثال‌ها🔗

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

3
4
1010
11
10101001110
8
00000000
Plain text

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

YES
1110
INVALID
NO
Plain text