[AtCoder]ABC B066 – ss[C++]

プログラミング

引き続き、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としなければいけません。
ループの範囲はループに入った時点で確定すると思っていたのですが、そうではないみたいです。気をつけましょう。

タイトルとURLをコピーしました