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

ARC-035-A 高橋くんと回文

■■■問題■■■

高橋くんは、ある文字列を持っていました。
あるとき、CatSnukeがやってきて文字列の一部を食べてしまいました。

高橋くんは元の文字列が回文であった可能性があるかを知りたいです。
そこで、食べられた文字を適切に埋め合わせて、回文とすることができるか調べてください。
食べられた文字それぞれを、どの文字で埋め合わせるかは自由に決められます。

■■■入力■■■

s

●Cat Snukeに食べられた後の文字列 s(1 <= |s| <= 1000) が1行で与えられる。
  ただし、|s| は文字列sの長さを表す。
●文字列sは英小文字、または*から成ることが保証される。
  *は食べられた文字を表す。それ以外の文字は、元の文字列の文字を表す。

■■■出力■■■

元の文字列が回文であった可能性があるならばYES、
可能性がないならばNOと標準出力に出力せよ。
末尾の改行を忘れないこと。


C#のソース

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

class Program
{
    static string InputPattern = "InputX";

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

        if (InputPattern == "Input1") {
            WillReturn.Add("ab*");
            //YES
            //*をaで埋め合わせると、abaとなるので、
            //元の文字列は回文であった可能性がある。
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("abc");
            //NO
            //abcは回文ではない
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("a*bc*");
            //YES
            //acbcaと埋め合わせると回文となる
        }
        else if (InputPattern == "Input4") {
            WillReturn.Add("***");
            //YES
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    static void Main()
    {
        List<string> InputList = GetInputList();
        string s = InputList[0];
        char[] wkCharArr = s.ToCharArray();
        int UB = wkCharArr.GetUpperBound(0);

        for (int I = 0; I <= UB; I++) {
            if (wkCharArr[I] == '*') {
                int TaiouInd = UB - I;
                wkCharArr[I] = wkCharArr[TaiouInd];
            }
        }

        if (wkCharArr.SequenceEqual(wkCharArr.Reverse()))
            Console.WriteLine("YES");
        else Console.WriteLine("NO");
    }
}


解説

文字が*だったら、対称位置の文字をコピーし、
最後に回文判定してます。