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

ABC-066-B ss

■■■問題■■■

同じ文字列を2つ並べてできる文字列のことを偶文字列と呼ぶことにします。
例えば、xyzxyzやaaaaaaは偶文字列ですが、
abababやxyzxyは偶文字列ではありません。

アルファベットの小文字からなる偶文字列Sが与えられます。
Sの末尾の文字を1文字以上消して作れる偶文字列のうち、最も長い偶文字列の長さを求めて下さい。
与えられる入力では、条件を満たす1文字以上の文字列が存在することが保証されています。

■■■入力■■■

S

●2 <= |S| <= 200
●Sは小文字のアルファベットのみからなる偶文字列である
●Sに対して、条件を満たす1文字以上の文字列が存在する

■■■出力■■■

答えとなる文字列の長さを出力せよ。


C#のソース

using System;
using System.Collections.Generic;

class Program
{
    static string InputPattern = "Input1";

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

        if (InputPattern == "Input1") {
            WillReturn.Add("abaababaab");
            //6
            //abaababaabは偶文字列ですが、1文字も消していないので条件を満たしません。
            //abaababaaは偶文字列ではありません。
            //abaababaは偶文字列ではありません。
            //abaababは偶文字列ではありません。
            //abaabaは偶文字列です。
            //よって、答えはabaabaの長さである6です。
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("xxxx");
            //2
            //xxxは偶文字列ではありません。
            //xxは偶文字列です。
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("abcabcabcabc");
            //6
            //条件を満たす文字列はabcabcなので、答えは6です。
        }
        else if (InputPattern == "Input4") {
            WillReturn.Add("akasakaakasakasakaakas");
            //14
            //条件を満たす文字列はakasakaakasakaなので、答えは14です。
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    static string mS;

    static void Main()
    {
        List<string> InputList = GetInputList();
        mS = InputList[0];

        for (int I = 1; I <= mS.Length; I++) {
            if (IsGuubunStr(I)) {
                Console.WriteLine(mS.Length - I);
                break;
            }
        }
    }

    //末尾N文字を削った文字が偶文字列かを判定
    static bool IsGuubunStr(int pN)
    {
        string wkStr = mS.Substring(0, mS.Length - pN);
        int WkLength = wkStr.Length;
        if (WkLength % 2 == 1) return false;

        string FirstStr = wkStr.Substring(0, WkLength / 2);
        string LastStr = wkStr.Substring(WkLength / 2, WkLength / 2);

        return FirstStr == LastStr;
    }
}


解説

ナイーブに解いてます。