AtCoderのARC
次のARCの問題へ
前のARCの問題へ
ARC124-B XOR Matching 2
C#のソース
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static string InputPattern = "InputX";
static List<string> GetInputList()
{
var WillReturn = new List<string>();
if (InputPattern == "Input1") {
WillReturn.Add("3");
WillReturn.Add("1 2 3");
WillReturn.Add("6 4 7");
//1
//5
}
else if (InputPattern == "Input2") {
WillReturn.Add("2");
WillReturn.Add("0 1");
WillReturn.Add("0 2");
//0
}
else if (InputPattern == "Input3") {
WillReturn.Add("24");
WillReturn.Add("14911005 70152939 282809711 965900047 168465665 337027481 520073861 20800623 934711525 944543101 522277111 580736275 468493313 912814743 99651737 439502451 365446123 198473587 285587229 253330309 591640417 761745547 247947767 750367481");
WillReturn.Add("805343020 412569406 424258892 329301584 123050452 1042573510 1073384116 495212986 158432830 145726540 623594202 836660574 380872916 722447664 230460104 718360386 620079272 109804454 60321058 38178640 475708360 207775930 393038502 310271010");
//8
//107543995
//129376201
//139205201
//160626723
//312334911
//323172429
//481902037
//493346727
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
int[] AArr = InputList[1].Split(' ').Select(pX => int.Parse(pX)).ToArray();
int[] BArr = InputList[2].Split(' ').Select(pX => int.Parse(pX)).ToArray();
Array.Sort(AArr);
int UB = AArr.GetUpperBound(0);
// Xの候補をHashSetに格納
var XSet = new HashSet<int>();
foreach (int EachB in BArr) {
XSet.Add(AArr[0] ^ EachB);
}
foreach (int EachX in XSet.ToArray()) {
var BList = new List<int>();
foreach (int EachB in BArr) {
BList.Add(EachX ^ EachB);
}
BList.Sort();
if (AArr.SequenceEqual(BList) == false) {
XSet.Remove(EachX);
}
}
Console.WriteLine(XSet.Count);
foreach (int EachX in XSet.OrderBy(pX => pX)) {
Console.WriteLine(EachX);
}
}
}
解説
最初にXの候補を列挙します。
次に下記の連立方程式を考えます。
a1 XOR b1 = X
a2 XOR b2 = X
a3 XOR b3 = X
移項して変形が可能です。
a1 = X XOR b1
a2 = X XOR b2
a3 = X XOR b3
以上により
aの集合と
(X XOR bの各要素) の集合
が等しいかを調べれば良いと分かります。