トップページに戻る    次の競技プログラミングの問題へ    前の競技プログラミングの問題へ

No.279 木の数え上げ

■■■問題■■■

kamipeipaa君は木が大好きですが,今日は文字列で遊んでいます。
kamipeipaa君は文字列Sを並び替えたときに"tree"という部分文字列をいくつ作ることが可能か興味があります。
教えてあげてください。

■■■入力■■■

S

kamipeipaa君が持つ英字小文字のみからなる文字列S(1 <= |S| <= 100万)が1行で与えられる。

■■■出力■■■

Sを自由に並び替えたときに作ることができる"tree"という部分文字列の数の最大値を1行で出力してください。
改行を忘れないこと。


C#のソース

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static string InputPattern = "Input4";

    static List<string> GetInputList()
    {
        var WillReturn = new List<string>();

        if (InputPattern == "Input1") {
            WillReturn.Add("takahashikunlovesyukicoder");
            //1
            //"takahashikunlovesyukicoder"を並び替えると"treeakahashikunlovsyukicod"とすることが可能であり、
            //この中に含まれる"tree"という部分文字列は1つです。
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("treapisnotki");
            //0
            //"treapisnotki"をどのように並び替えても"tree"という部分文字列を得ることはできません
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("eerteerteerteert");
            //4
            //"eerteerteerteert"という文字列を並び替えると、
            //"treetreetreetree"とすることが可能であり、
            //この中に含まれる"tree"という部分文字列は4つです
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    static void Main()
    {
        List<string> InputList = GetInputList();
        string S = InputList[0];
        int CntT = S.Count(X => X == 't');
        int CntR = S.Count(X => X == 'r');
        int CntE = S.Count(X => X == 'e');

        int Answer = Math.Min(CntT, CntR);
        Answer = Math.Min(Answer, CntE / 2);
        Console.WriteLine(Answer);
    }
}


解説

並び替えが自由にできるので、
作成できるtreeという文字列の数は、tとrとeの文字数から計算できます。