using System;

namespace ソフトウェア塾
{

    class Program
    {
        static void Main(string[] args)
        {
            // http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0506
            // 入力から出力までの流れ
            // 1. 入力処理
            //    入力は複数のデータセットからなる．n が 0 のとき入力が終了する．データセットの数は 5 を超えない．
            // 2. 出力する文字列を作成する
            // 3. 出力処理
            //    データセットごとに、指定された回数の操作を施した文字列 を１行に出力する．
            int[] Input_ExeNumber = new int[5];     //入力操作回数
            string[] Input_Word = new string[5];     //入力文字列
            string[] Output_Word = new string[5];        //出力
            int DataSet = 0;        //データセット数
            int DataSet_Limit = 5;  //データセットの上限
            int ExeNumber_Limit = 20;       //操作回数制限
            int Word_Limit = 100;           //入力文字列制限


            Input In = new Input();
            Output Out = new Output();
            Calculation Cal = new Calculation();

            // 1. 入力処理
            In.Input_Data(ExeNumber_Limit, Word_Limit, DataSet_Limit, Input_ExeNumber, Input_Word, out DataSet);  //「out」で戻り値取得

            // 2. 出力する文字列を作成する
            Cal.GetAnswer(DataSet, Input_ExeNumber, Input_Word, Output_Word);
            //Cal.Test(DataSet, Input_ExeNumber, Input_Word, Output_Word);

            // 3. 出力処理
            Out.Output_Data(DataSet, Output_Word);
        }
    }


    class Input
    {
        public void Input_Data(int ExeNumber_Limit, int Word_Limit, int DataSet_Limit, int[] Answer_ExeNumber, string[] Answer_Word, out int DataSet)
        {
            Output Out = new Output();

            // 出力の初期化
            DataSet = 0;

            // 入力データを配列に格納し、データセット数を取得する
            for (int n = 0; n <= DataSet_Limit - 1; n++)
            {
                // 操作回数入力
                Answer_ExeNumber[n] = int.Parse(Console.ReadLine());

                // 操作回数に0が入力されたら終了
                if (Answer_ExeNumber[n] == 0)
                {
                    break;
                }

                // 操作回数が20より大きければ強制終了
                if (Answer_ExeNumber[n] > ExeNumber_Limit)
                {
                    Out.Output_Error(2);
                    Environment.Exit(-1);
                }

                // 最初の文字列入力
                Answer_Word[n] = Console.ReadLine();

                // 入力された文字列が100文字より大きければ強制終了
                if (Answer_Word[n].Length > Word_Limit)
                {
                    Out.Output_Error(1);
                    Environment.Exit(-1);
                }

                // データセット数の更新
                DataSet = DataSet + 1;
            }

            return;
        }
    }


    class Output
    {
        public void Output_Data(int Limit, string[] Output)
        {
            for (int n = 0; n <= Limit - 1; n++)
            {
                Console.Write("{0}\r\n", Output[n]);
            }
        }
        public void Output_Error(int Argument)
        {
            switch (Argument)
            {
                case 1:
                    Console.Write("ErrorNumber = {0}\r\n入力文字列が100文字以下でないため強制終了", Argument);
                    break;
                case 2:
                    Console.Write("ErrorNumber = {0}\r\n操作回数が20以下でないため強制終了", Argument);
                    break;
            }
            return;
        }
    }

    class Calculation
    {
        public void GetAnswer(int Argument_DataSet, int[] Argument_ExeNumber, string[] Argument_Word, string[] Answer_Word)
        {
            string Word;        // 文字列

            // DataSet分だけ処理を実行する
            for (int n = 0; n <= Argument_DataSet - 1; n++)
            {
                // 最初の文字列の格納
                Word = Argument_Word[n];

                // 実行回数分だけ下記操作を繰り返す
                for (int m = 0; m <= Argument_ExeNumber[n] - 1; m++)
                {
                    // 与えられた文字列を左端から1文字ずつ順に読んで行き,同じ数字 a が r 個続いていた場合,個数 r と数字a を空白で区切らずにこの順で書き出す
                    Word = WordMake(Word);
                }

                // 出力に文字列を格納する
                Answer_Word[n] = Word;
            }

            return;
        }

        public string WordMake(string Argument)
        {
            string Answer = null;
            string Number = null;
            string Word = Argument;
            int len = 0;
            
            // Wordの文字数が0になるまで処理を繰り返す
            while(Word.Length > 0)
            {
                //初期化
                len = 0;
                Number = Word.Substring(0, 1);

                // Wordの先頭の文字と等しい文字の数を取得
                for (int n = 1; n <= Word.Length; n++)
                {
                    if (Word.Substring(n - 1, 1) == Number)
                    {
                        len = n;
                    }
                    else
                    {
                        break;
                    }
                }

                // Answerに先頭の文字と文字数を連結する
                Answer = string.Concat(Answer, len.ToString(), Number);

                // 文字数分、Wordの先頭から文字を削る
                Word = Word.Remove(0, len);
            }

            return Answer;
        }

        public void Test(int Argument_DataSet, int[] Argument_ExeNumber, string[] Argument_Word, string[] Answer_Word)
        {
            //Answer_Word[0] = Argument_Word[0].Length.ToString(); //文字の数を取得
            //Answer_Word[0] = Argument_Word[0].Substring(0, 1); //先頭の文字を取得
            //Answer_Word[0] = Argument_Word[0].Remove(0, 1); //先頭から1文字削除
            //Answer_Word[0] = null; //初期化
            //Answer_Word[0] = string.Concat(Argument_Word[0], Argument_Word[1], Argument_Word[2]); //文字列の連結

            //for (int n = 1; n <= Argument_Word[0].Length; n++)
            //{
            //    if(Argument_Word[0].Substring(n - 1, 1) == Argument_Word[0].Substring(0, 1))
            //    {
            //        Answer_Word[0] = n.ToString();
            //    }
            //    else
            //    {
            //        break;
            //    }
            //}


            return;
        }

    }


}



Measured memory_bytes: 42460