AtCoderのABC
次のABCの問題へ
前のABCの問題へ
ABC232-B Caesar Cipher
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("abc");
WillReturn.Add("ijk");
//Yes
}
else if (InputPattern == "Input2") {
WillReturn.Add("z");
WillReturn.Add("a");
//Yes
}
else if (InputPattern == "Input3") {
WillReturn.Add("ppq");
WillReturn.Add("qqp");
//No
}
else if (InputPattern == "Input4") {
WillReturn.Add("atcoder");
WillReturn.Add("atcoder");
//Yes
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
string S = InputList[0];
string T = InputList[1];
var DiffModSet = new HashSet<int>();
for (int I = 0; I <= S.Length - 1; I++) {
int DiffMod = (S[I] - T[I]) % 26;
if (DiffMod < 0) DiffMod += 26;
DiffModSet.Add(DiffMod);
}
if (DiffModSet.Count == 1) {
Console.WriteLine("Yes");
}
else {
Console.WriteLine("No");
}
}
}
解説
シーザー暗号で、移動距離がユニークなら可能なので
1文字目から最後の文字までの移動距離をHashSetで管理して
HashSetのCountを見てます。
コンテストでは、
移動距離を26でmodを取る必要があるのに気づかなくて、
WAを出したので反省。