引き続き、AtCoderのB問題をC++で解いていきます。
ABC B066 – ss
問題
同じ文字列を2つ並べてできる文字列のことを偶文字列と呼ぶことにします。 例えば、 xyzxyz
や aaaaaa
は偶文字列ですが、ababab
や xyzxy
は偶文字列ではありません。
アルファベットの小文字からなる偶文字列Sが与えられます。 Sの末尾の文字を1文字以上消して作れる偶文字列のうち、最も長い偶文字列の長さを求めて下さい。 与えられる入力では、条件を満たす1文字以上の文字列が存在することが保証されています。
自分の回答
#include <bits/stdc++.h>
using namespace std;
int main () {
string S;
cin >> S;
int N = S.size()
for(int i = 0; i < N; i++){
// 末尾削除
S.pop_back();
string S1, S2;
S1 = S.substr(0, S.size() / 2);
S2 = S.substr(S.size() / 2);
if(S1 == S2){
cout << S.size() << endl;
exit(0);
}
}
}
まずはpop_back関数を使って、末尾を削除します。
次に、残された文字列の前半分をS1、後ろ半分をS2とします。そして、S1とS2が等しい時は、元の文字列Sの大きさを出力します。
自分が間違えた点としては、forのループの範囲をi<S.size()としていたところです。Sはpop_back関数で末尾を消すことで、S.size()の値が変わっていってしまうので、適切ではありません。
ループに入る前に、int N = S.size()として、ループの範囲をi < Nとしなければいけません。
ループの範囲はループに入った時点で確定すると思っていたのですが、そうではないみたいです。気をつけましょう。