using System; using System.Collections.Generic; using System.Linq; // https://yukicoder.me/problems/no/3015 class Program { static string InputPattern = "InputX"; static List GetInputList() { var WillReturn = new List(); if (InputPattern == "Input1") { WillReturn.Add("10110110"); //3 } else if (InputPattern == "Input2") { WillReturn.Add("0000000010000001111"); //0 } else { string wkStr; while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr); } return WillReturn; } static void Main() { List InputList = GetInputList(); string S = InputList[0]; List RunLenList = RunLen.DeriveRunLenInfoList(S); long Answer = 0; long BCnt = 0; for (int I = RunLenList.Count - 1; 0 <= I; I--) { if (RunLenList[I].AppearChar == '0') { BCnt += RunLenList[I].RunLen; } if (RunLenList[I].AppearChar == '1') { long Div2 = RunLenList[I].RunLen / 2; Answer += Div2 * BCnt; } } Console.WriteLine(Answer); } } #region RunLen // ランレングス圧縮(文字列) internal class RunLen { // ランレングス圧縮情報 internal struct RunLenInfo { internal char AppearChar; internal int RunLen; } // ランレングス圧縮結果を返す internal static List DeriveRunLenInfoList(string pBaseStr) { var WillReturn = new List(); int StrUB = pBaseStr.Length - 1; char PrevChar = pBaseStr[0]; int StrLen = 0; for (int I = 0; I <= StrUB; I++) { if (pBaseStr[I] != PrevChar) { RunLenInfo WillAdd; WillAdd.AppearChar = PrevChar; WillAdd.RunLen = StrLen; WillReturn.Add(WillAdd); StrLen = 0; PrevChar = pBaseStr[I]; } StrLen++; if (I == StrUB) { RunLenInfo WillAdd; WillAdd.AppearChar = pBaseStr[I]; WillAdd.RunLen = StrLen; WillReturn.Add(WillAdd); } } return WillReturn; } } #endregion