トップページに戻る
次の競技プログラミングの問題へ
前の競技プログラミングの問題へ
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;
}
}
解説
ナイーブに解いてます。