using System; using System.Collections.Generic; namespace lecture { class MainClass { public class TagScore { public string tag; public int score; } public static void Main(string[] args) { string row = Console.ReadLine(); int N = int.Parse(row); Dictionary tagScores = new Dictionary(); for (int i = 0; i < N; i++) { // 画像の番号の行を読み込む string imageNo = Console.ReadLine(); // タグの数 スコアの行を読み込む row = Console.ReadLine(); // Split() は引数がないと空白で区切って配列にする string[] ss = row.Split(); // 配列の0番目がタグの数 int tagNum = int.Parse(ss[0]); // 配列の1番目がスコア int score = int.Parse(ss[1]); // タグの行を読み込んで 空白で区切るとタグの配列になる string[] tagsTmp = Console.ReadLine().Split(); // tags[0]=run,tags[1]=getaway ,tags[2]=fast // それぞれのタグの点数を加算していくだけ for (int m = 0; m < tagsTmp.Length; m++) { string tag = tagsTmp[m]; if (tagScores.ContainsKey(tag)) { // Dictionaryにtags[m]の文字列のキーが有る場合 // すでにあるキーにスコアを追加してあげる // すでにキーが有る場合は += で追加する tagScores[tag] += score; } else { // キーがない場合は そのスコア作る // 作る場合は =で 代入する tagScores[tag] = score; } } } // ここまでで、タグとスコアの値を合計できるはず // tagScores.Countはそのキーの数なのでその分配列を確保する // タグの名前とそのタグのスコア分の配列を用意する TagScore[] tagScoreArray = new TagScore[tagScores.Count]; // Dictonaryから一旦配列に入れ直す int p = 0; foreach (string key in tagScores.Keys) { TagScore t = new TagScore(); t.tag = key; t.score = tagScores[key]; tagScoreArray[p] = t; p++; } Array.Sort(tagScoreArray, ScoreSort); // 最大10件まで出力する int count = 10; if (count > tagScoreArray.Length) { count = tagScoreArray.Length; } for (int i = 0; i < count; i++) { Console.WriteLine(tagScoreArray[i].tag + " " + tagScoreArray[i].tag); } } // x , y という順で引数が与えられる。 // xのほうが先に来てほしい場合 戻り値は -1 // 逆の場合は 戻り値は 1     を返す // あまり気にしなくてもいいんですが 同じ場合は0を返す public static int ScoreSort(TagScore x, TagScore y) { if (x.score > y.score) { return -1; } else if (x.score < y.score) { return 1; } else { // x.score == y.scoreのとき if (x.tag.CompareTo(y.tag) == -1) { return -1; } else if (x.tag.CompareTo(y.tag) == 1) { return 1; } else { return 0; } } } } }