using System; using System.Collections.Generic; class Program { static string InputPattern = "InputX"; static List GetInputList() { var WillReturn = new List(); if (InputPattern == "Input1") { WillReturn.Add("abc"); //4 //abc、acb、cab、cbaの4通りがある } else if (InputPattern == "Input2") { WillReturn.Add("aab"); //3 //aab、aba、baaの3通りがある } else if (InputPattern == "Input3") { WillReturn.Add("aaaaaaaaaa"); //1 //どのようにしてもaaaaaaaaaaにしかならない } else { string wkStr; while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr); } return WillReturn; } struct JyoutaiDef { internal string CurrStr; internal string CreateStr; } static void Main() { List InputList = GetInputList(); string S = InputList[0]; var stk = new Stack(); JyoutaiDef WillPush; WillPush.CurrStr = S; WillPush.CreateStr = ""; stk.Push(WillPush); var CreateStrSet = new HashSet(); while (stk.Count > 0) { JyoutaiDef Popped = stk.Pop(); //クリア判定 if (Popped.CurrStr == "") { CreateStrSet.Add(Popped.CreateStr); continue; } Action PushSyori = pRemoveInd => { WillPush.CurrStr = Popped.CurrStr.Remove(pRemoveInd, 1); WillPush.CreateStr = Popped.CreateStr + Popped.CurrStr[pRemoveInd]; stk.Push(WillPush); }; PushSyori(0); PushSyori(Popped.CurrStr.Length - 1); } Console.WriteLine(CreateStrSet.Count); } }