トップページに戻る
次の競技プログラミングの問題へ
前の競技プログラミングの問題へ
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の文字数から計算できます。