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;
}