yokobuttonの不定期で競技プログラミングをするブログ

不定期で解けた競技プログラミングコンテストの問題を載せています。

AtCoder Beginner Contest 237 C - kasaka

問題の要約
 英小文字からなる文字列Sが与えられる。Sの先頭にaをいくつか(0個でもよい)付け加えて回文にすることができるか判定せよ。
制約
 1<=|S|<=10^6
入力
 S
考え方
 1,Sにaの挿入と削除をしてaの数を合わせてから、その次に回文を判定したい。
  Sの先頭にaを挿入・削除するのは重い操作、Sの末尾のaを削除するのは軽い操作(挿入・削除した場所から後ろをずらしている)なので、Sの末尾のaを削除する操作だけで前処理を終えたい。
 2,for文でSの先頭と末尾から見て、両方がaならば次の文字を見る。
  後ろの文字だけがaならば末尾のaを削除する。
  それ以外ならば、そのときの文字の場所を記憶しておく。
 3,2で記憶した場所から回文かどうか判定する。
実際のプログラム
#include<iostream>
#include<string>

using namespace std;

int main(){
  string S;
  cin >> S;
  
  long next = 0;
  for(long i = 0; i <= S.size()/2; ){
    if(S[i] == 'a' && S[S.size()-1-i] == 'a'){
      i++;
    }else if(S[i] != 'a' && S[S.size()-1-i] == 'a'){
      S.erase(S.size()-1,1);
    }else{
      next = i;
      break;
    }
  }

  bool check = true;
  for(long i = next; i <= S.size()/2; i++){
    if(S[i] != S[S.size()-1-i]){
      check = false;
      break;
    }
  }
  
  if(check){
    cout << "Yes" << endl;
  }else{
    cout << "No" << endl;
  }
  
  return 0;
}