public override void CreateSamples(System.IO.StreamReader reader)
        {
            ReverseShuffleMergeSample sample = new ReverseShuffleMergeSample()
            {
                s = reader.ReadLine()
            };

            Samples.Add(sample);
        }
        public TAnswer BF(TSample Sample)
        {
            ReverseShuffleMergeSample sample = Sample as ReverseShuffleMergeSample;
            String s = sample.s;

            char[] result = new Char[s.Length / 2];

            Int32 aPos = 'a';
            Int32 zPos = 'z';

            Int32[] cnt           = new Int32[zPos - aPos + 1];
            Int32   UniqueLetters = 0;

            for (int i = 0; i < s.Length; i++)
            {
                cnt[s[i] - aPos]++;
            }

            Int32[] ap = new Int32[cnt.Length];
            for (int i = 0; i < cnt.Length; i++)
            {
                ap[i] = cnt[i] / 2;
                if (cnt[i] != 0)
                {
                    UniqueLetters++;
                }
            }


            Int32 ZeroesCount = 0;
            Int32 ptr         = 0;

            for (int i = 0; i < s.Length; i++)
            {
                ap[s[i] - aPos]--;
                if (ap[s[i] - aPos] == 0)
                {
                    ZeroesCount++;
                }
                if (UniqueLetters == ZeroesCount)
                {
                    ptr = i;
                    break;
                }
            }

            Char min = 'z';

            Int32 MinPtr = ptr;

            for (int i = ptr; i < s.Length; i++)
            {
                if (min >= s[i])
                {
                    min    = s[i];
                    MinPtr = i;
                }
            }

            result[0] = min;


            Int32[] ReverseCnt = new Int32[cnt.Length];
            Int32[] ShuffleCnt = new Int32[cnt.Length];


            ReverseCnt[min - aPos]++;

            for (int i = MinPtr + 1; i < s.Length; i++)
            {
                ShuffleCnt[s[i] - aPos]++;
            }


            Int32 pos  = 1;
            Int32 iptr = MinPtr - 1;

            while (iptr >= 0 && pos != result.Length)
            {
                if (ReverseCnt[s[iptr] - aPos] == cnt[s[iptr] - aPos] / 2)
                {
                    ShuffleCnt[s[iptr] - aPos]++;
                    iptr--;
                    continue;
                }
                if (ShuffleCnt[s[iptr] - aPos] == cnt[s[iptr] - aPos] / 2)
                {
                    result[pos] = s[iptr];
                    ReverseCnt[s[iptr] - aPos]++;
                    iptr--;
                    pos++;
                    continue;
                }

                Int32[] tempCnt = new Int32[ShuffleCnt.Length];
                Array.Copy(ShuffleCnt, tempCnt, ShuffleCnt.Length);

                Int32 NewMinPtr = iptr;
                for (int j = iptr; j >= 0; j--)
                {
                    if (ReverseCnt[s[j] - aPos] < cnt[s[j] - aPos] / 2 && s[NewMinPtr] > s[j])
                    {
                        NewMinPtr = j;
                    }
                    if (tempCnt[s[j] - aPos] == cnt[s[j] - aPos] / 2)
                    {
                        break;
                    }
                    tempCnt[s[j] - aPos]++;
                }

                for (int j = iptr; j > NewMinPtr; j--)
                {
                    ShuffleCnt[s[j] - aPos]++;
                }

                ReverseCnt[s[NewMinPtr] - aPos]++;
                result[pos] = s[NewMinPtr];
                pos++;
                iptr = NewMinPtr - 1;
            }



            return(new ReverseShuffleMergeAnswer()
            {
                result = new string(result)
            });
        }