====== Xor ======
به شما $n$ عدد $a_1$ تا $a_n$ داده شده است، شما باید زیرمجموعه ای از آن را بیابید که اعداد هیچ
زیرمجموعهی ناتهی آن برابر با 0 نشود و جمع اعداد آن بیشینه باشد.
===== ورودی =====
در سطر اول ورودی عدد $1 \leq n \leq 100$ آمده است، در سطر بعدی $n$ عدد $a_1$ تا $a_n$ آمده است.
===== خروجی=====
در تنها سطر خروجی اعداد زیر مجموعه را به ترتیب صعودی چاپ نمایید. در صورتی که چند جواب برای سؤال وجود دارد، یکی از آنها را چاپ نمایید.
===== محدودیتها =====
* محدودیت زمان: ۲ ثانیه
* محدودیت حافظه: ۲۵۶ مگابایت
===== ورودي و خروجي نمونه =====
^ ورودي نمونه ^ خروجي نمونه ^
|3 \\ 1 2 3 |2 3 |
<پاسخ>
ابتدا توجه کنید که اگر یک مجموعه از اعداد هیچ زیر مجموعهی ناتهی نداشته باشد که XOR اعضای آن صفر شود، معادل این است که هیچ یک از اعضای آن را نتوان برحسب XOR بقیهی اعضا نوشت. چون اگر یک عضو را بتوان برحسب بقیهی اعضا نوشت XOR این عضو با بقیهی اعضا صفر میشود. اگر هم XOR یک زیر مجموعه صفر شد XOR هر یک از اعضا باید برابر با XOR بقیه شود.
برای حل این مسئله از الگریتم حریصانه استفاده میکنیم. یعنی اعداد را ابتدا به ترتیب نزولی مرتب میکنیم. سپس به ترتیب اعداد را پیمایش میکنیم و هر عددی که اجتماعش با اعداد انتخاب شدهی قبلی تولید زیرمجموعهای نمیکرد که XOR آن صفر شود را انتخاب میکنیم. فرض کنید در این الگریتم اعداد $x_1$ تا $x_k$انتخاب شده باشند. (که اینها به ترتیب نزولی هستند) اگر این مجموعه تشکیل یک جواب بهینه بدهند که مسئله حل است. در غیر این صورت یک جواب بهینه به صورت $y_1$ تا $y_k'$ در نظر بگیرید. $i$ را کوچکترین اندیس بگیرید که $x_i \neq y_i$ است. مطمئنا هیچ یک از $y_1$ تا $y_k'$ ها نباید مساوی با $x_i$ باشند و چون $y_1$ تا $y_k'$ تشکیل یک جواب بهینه میدهند پس اجتماع آنها با $x_i$ یک زیرمجموعه دارد که XOR اعضایش صفر هستند. $x_i$ باید عضو این زیرمجوعه باشد. پس $x_i$ را میتوان برحسب XOR $y_1$ تا $y_{k'}$ نوشت. فرض کنید این اعضا $z_1$ تا $z_m$ باشند. پس داریم:
$$ x_i=z_1\oplus \cdots \oplus z_m $$
همهی $z_1$ تا $z_m$ ها نمیتوانند از $x_i$ بزرگتر باشند چون با توجه به اینکه اعضای بزرگتر از $x_i$ در $x_1$ تا $x_k$ با $y_1$ تا $y_k'$ برابرند در این صورت زیر مجموعهی $x_1$ تا $x_i-1$ میشوند. پس $z_j$ موجود است که $z_j
* [[سوال ۵۲|سوال بعد]]
* [[سوال ۵۰|سوال قبل]]