トップページに戻る
   次の競技プログラミングの問題へ
   前の競技プログラミングの問題へ
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で、処理を分岐させてます。