AtCoderのABC
次のABCの問題へ
前のABCの問題へ
ABC137-C Green Bin
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("acornistnt");
WillReturn.Add("peanutbomb");
WillReturn.Add("constraint");
//1
}
else if (InputPattern == "Input2") {
WillReturn.Add("2");
WillReturn.Add("oneplustwo");
WillReturn.Add("ninemodsix");
//0
}
else if (InputPattern == "Input3") {
WillReturn.Add("5");
WillReturn.Add("abaaaaaaaa");
WillReturn.Add("oneplustwo");
WillReturn.Add("aaaaaaaaba");
WillReturn.Add("twoplusone");
WillReturn.Add("aaaabaaaaa");
//4
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
var SDict = new Dictionary<string, int>();
for (int I = 1; I <= InputList.Count - 1; I++) {
char[] wkArr = InputList[I].ToCharArray();
Array.Sort(wkArr);
string SortedStr = new string(wkArr);
if (SDict.ContainsKey(SortedStr)) {
SDict[SortedStr]++;
}
else {
SDict[SortedStr] = 1;
}
}
int MaxCnt = SDict.Values.Max();
// 三角数の値を求める
var SankakuDict = new Dictionary<int, long>();
long SankakuSum = 0;
for (int I = 1; I <= MaxCnt; I++) {
SankakuSum += I;
SankakuDict[I] = SankakuSum;
}
long Answer = 0;
foreach (var EachPair in SDict) {
if (EachPair.Value == 1) continue;
Answer += SankakuDict[EachPair.Value - 1];
}
Console.WriteLine(Answer);
}
}
解説
abc
acb
bac
cab
cba
ddd
eee
といった入力があった
abcから構成されるアナグラムは 5C2 で 5*4/2 = 10 通りあります。
なので、アナグラムごとに集計しておき、
(件数 C 2) の総合計が解になります。
2C2 = 1
3C2 = 3
4C2 = 6
5C2 = 10
6C2 = 15
なので、三角数を順に求めてます。