トップページに戻る
次の競技プログラミングの問題へ
前の競技プログラミングの問題へ
AGC-005-A STring
■■■問題■■■
文字列Xが与えられます。Xの長さは偶数であり、半分はS、もう半分はTからなります。
高橋君はSTという文字列が苦手です。なので以下の操作を(10の10000乗)回行うことにしました。
●Xの(連続な)部分文字列でSTとなるもののうち、最も左側にあるものを取り除く。
存在しないならば何もしない。
最終的にXは何文字になるかを求めてください。
■■■入力■■■
X
●2 <= |X| <= 20万
●Xの長さは偶数
●Xを構成する文字のうち半分はSであり、もう半分はTである
■■■出力■■■
1行に問題の答えを出力する。
C#のソース
using System;
using System.Collections.Generic;
class Program
{
static string InputPattern = "InputX";
static List<string> GetInputList()
{
var WillReturn = new List<string>();
if (InputPattern == "Input1") {
WillReturn.Add("TSTTSS");
//4
//1回目の操作ではTSTTSSの2,3文字目がSTなので取り除きます。
//XはTTSSになり、もうSTはないため残り (10の10000乗)-1回は何もしません。
//よって答えは4となります。
}
else if (InputPattern == "Input2") {
WillReturn.Add("SSTTST");
//0
//SSTTST ⇒ STST ⇒ ST ⇒ 空文字列 となり、
//最終的に空文字列になります。
}
else if (InputPattern == "Input3") {
WillReturn.Add("TSSTTTSS");
//4
//TSSTTTSS ⇒ TSTTSS ⇒ TTSS となります
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
string X = InputList[0];
int SCnt = 0;
int RemoveCnt = 0;
foreach (char EachChar in X) {
if (EachChar == 'S') SCnt++;
if (EachChar == 'T' && SCnt > 0) {
RemoveCnt++;
SCnt--;
}
}
Console.WriteLine(X.Length - RemoveCnt * 2);
}
}
解説
文字列を順に見ていって、
対応するTがあるSと、
対応するTがないSで、処理を分岐させてます。