กำหนดให้
- เป็นเซตของ cycle ทั้งหมดในกราฟที่โจทย์กำหนดให้
- คือแต้มที่ได้จากการเดินบน path สำหรับ path จาก node ไป ใด ๆ (อาจเขียนเป็น แทน ได้)
Observation 1
หากมี path จาก node ไป node หนึ่งเส้นทางเรียกว่า เราสามารถเติม cycle ใด ๆ เข้าไปใน path นี้โดยแต้มจะเท่ากับ เสมอ
ให้ เป็น node หนึ่งที่อยู่ใน และ เป็น node หนึ่งที่อยู่ใน เราสามารถเดินทางจาก ไป ได้โดย
- เดินทางบน path จาก ไป
- เดินทางบน path จาก ไป (มีเสมอเนื่องจากโจทย์รับประกันว่าเป็น connected graph)
- เดินทางบน cycle จนกว่าจะวนกลับมาที่ อีกครั้ง
- เดินทางบน path จาก ไป
- เดินทางบน path จาก ไป
เนื่องจากแต้มที่ได้จากการเดินทางคำนวณจาก XOR ของน้ำหนักเส้นเชื่อมทั้งหมดที่เดินผ่าน ขั้นตอนที่ 2 และ 4 จะหักล้างกัน เปรียบเสมือนว่ามีเพียงแค่ และ ที่นำมาคิดเป็นแต้มรวมเท่านั้น
หาก และ ไม่มีเส้นเชื่อมซ้ำกันเลยจะเห็นได้ชัดเจนว่าแต้มรวมย่อมเท่ากับ
กรณีที่มีเส้นเชื่อมซ้ำกัน การเดินบน cycle จะมีผลเปรียบเสมือนการเปลี่ยน path ตั้งต้น เช่น หาก คือ และ คือ เมื่อนำมาผสมกันเป็น จะเปรียบเสมือนการเดินทางบน โดยตรง
จากข้อสังเกตนี้ เราสามารถสรุปได้ว่า เราสามารถสร้าง path จาก ไป ทุก path ที่เป็นไปได้ โดยใช้ path ตั้งต้นเพียง path เดียวเท่านั้นแล้วเติม cycle ตามความเหมาะสม
หากเราเลือก cycle ดี ๆ เราสามารถสร้าง path จาก ไป ให้ได้แต้มรวมมากสุด
Observation 2
บาง cycle ในกราฟสามารถสร้างได้จากการนำ cycle อื่นอย่างน้อย 2 cycle มาผสมกัน เช่น cycle เมื่อนำมาผสมกับ จะได้เป็น เพราะเส้นเชื่อมระหว่าง กับ ถูกหักล้างจากการเดินทางซ้ำสองครั้ง
ดังนั้น เราสามารถตัดบาง cycle ออกจากเซต ได้โดยไม่สูญเสียอิสระในการเติม cycle ให้ path ตามที่กล่าวในหัวข้อก่อนหน้า
เรียกเซตที่เล็กที่สุดที่เราสามารถนำสมาชิกมารวมกันแล้วสามารถสร้างทุก ได้ว่า basis ของ หรือ fundamental cycle set โดยในที่นี้เราจะใช้สัญลักษณ์
วิธีสร้าง ที่ง่ายที่สุดคือการ Depth-first Search ออกจาก node หนึ่งในกราฟ (สมมุติว่า node ) จะได้ tree edge เป็นเส้นที่จะใช้ใน path ตั้งต้นระหว่างคู่ node ใด ๆ และ back edge ทั้งหมดเป็นเส้นที่ใช้ในการสร้าง fundamental cycle set (เส้นที่เชื่อมระหว่าง กับ จะทำให้เกิด cycle )
เพื่อความสะดวกในการคำนวณต่อจากนี้ ระหว่าง Depth-first Search ให้สร้าง array ไว้เพื่อเก็บค่าของ สำหรับทุก node
นอกจากนี้ สำหรับแต่ละ back edge ที่เชื่อมระหว่าง และ ให้เก็บแต้มที่ได้จากการเดินบน cycle นั้น คำนวณได้จาก (สองพจน์แรกได้จากที่คำนวณไว้ย่อหน้าก่อนหน้า พจน์สุดท้ายคือน้ำหนักของเส้นเชื่อมระหว่าง กับ )
Observation 3
ในการหา path ที่ได้แต้มมากที่สุดจาก ไป เราสามารถหา path ตั้งต้น (เรียกว่า ) ได้โดยเดินทางจาก ไป และจาก ไป ทำให้ได้
การเลือกเติม cycle ต่าง ๆ เข้าไปทำให้แต้มเปลี่ยน เนื่องจากเราไม่ได้สนใจว่าเติม node อะไรเข้าไปบ้างกันแน่ ต่อไปนี้ จะมองว่า เป็นเซตของจำนวนเต็มที่เราสามารถนำไป XOR เพื่อสร้างคำตอบได้
เช่นเดียวกับ Observation 2 ค่า บางค่าอาจจะตัดออกได้เพราะสามารถสร้างจากค่าอื่น ๆ ใน ได้ เช่น หาก สามารถตัด ออกได้เพราะ (หรือตัดตัวอื่นก็ได้)
กำหนดให้ แทนเซตที่เล็กที่สุดที่เป็น basis ของ
เราสามารถหา ได้โดยใช้ขั้นตอนวิธี Gaussian Elimination โดยให้แต่ละแถวของเมทริกซ์แทนเลขแต่ละ cycle และแต่ละคอลัมน์แทนแต่ละ bit ของเลขดังกล่าว
เนื่องจากโจทย์รับประกันว่า ดังนั้นเมทริกซ์จะมีทั้งหมด คอลัมน์
สุดท้ายแล้ว เราจะได้ basis ที่ประกอบไปด้วยตัวเลขไม่เกิน ตัว โดยที่ตัวเลขแต่ละตัวจะมี most significant digit ต่างกันทั้งหมด
สำหรับ query การเดินจาก ไป สามารถหาแต้มรวมมากสุดที่เป็นไปได้โดยกำหนดให้ แล้วตัดสินใจว่าจะนำสมาชิกแต่ละตัวใน มา XOR หรือไม่ โดยตัดสินใจตั้งแต่ตัวเลขที่มากที่สุดมายังตัวเลขที่น้อยที่สุดแบบ greedy (หากนำมา XOR แล้วได้คำตอบดีขึ้นให้ XOR ทันที)