คำชี้แจงปัญหา
เมื่อกำหนดช่วง [L, R] เราจำเป็นต้องค้นหาจำนวนเต็มสองตัวในช่วงนี้ โดยที่ XOR ของพวกมันจะสูงสุดในบรรดาตัวเลือกที่เป็นไปได้ทั้งหมดของจำนวนเต็มสองจำนวน
หากช่วงที่กำหนดคือ L =1 และ R =21 เอาต์พุตจะเป็น 31 เนื่องจาก −31 คือ XOR ของ 15 และ 16 และมีค่าสูงสุดภายในช่วง
อัลกอริทึม
<ก่อน>1. คำนวณค่า (L^R)2 จากบิตที่สำคัญที่สุดของค่านี้ ให้บวก 1 ทั้งหมดเพื่อให้ได้ผลลัพธ์สุดท้ายตัวอย่าง
#includeใช้เนมสเปซ std;int getMaxXOR(int L, int R){ int LXR =L ^ R; int msbPos =0; ในขณะที่ (LXR) { msbPos ++; LXR>>=1; } int maxXOR =0; int สอง =1; ในขณะที่ (msbPos--) { maxXOR +=สอง; สอง <<=1; } ส่งคืน maxXOR;}int main(){ int L =1; int R =21; ศาล <<"ผลลัพธ์ =" < ผลลัพธ์
เมื่อคุณคอมไพล์และรันโปรแกรมข้างต้น มันสร้างผลลัพธ์ต่อไปนี้ -
ผลลัพธ์ =31