前提・実現したいこと
AtCoderのABC049C-白昼夢に関する質問です。https://atcoder.jp/contests/abc049/tasks/arc065_a?lang=ja
#####問題文
英小文字からなる文字列Sが与えられ、Tが空文字列である状態から始め、「Tの末尾にdream,dreamer,erase,eraserのいずれかを追加する。」という操作を好きな回数繰り返すことでS=TとすることができるかをYESかNOで判定します。
後ろに特定の文字列があれば除去していく方法で考えました。
下記のソースコードを試したところ、いくつかのテストケースで実行時エラーが出たので改善点をご教授願いたいです。
該当のソースコード
c++
1#include<iostream> 2#include<string> 3using namespace std; 4int main(){ 5 string s; 6 cin >> s; 7 string v[4]={"dream","dreamer","erase","eraser"}; 8 string ans[2]={"YES","NO"}; 9 int ans_flag=0; 10 while(s.size()>0){ 11 int flag=0; 12 for(int i=0;i<4;i++){ 13 if(s.rfind(v[i])==s.size()-v[i].size()){ 14 s=s.erase(s.rfind(v[i])); 15 flag=1; 16 break; 17 } 18 } 19 if(flag==0){ 20 ans_flag=1; 21 break; 22 } 23 } 24 cout << ans[ans_flag] << endl; 25 return 0; 26}
発生している問題・エラーメッセージ
terminate called after throwing an instance of 'std::out_of_range' what(): basic_string::erase: __pos (which is 18446744073709551615) > this->size() (which is 6)
試したこと
テストケースは公開されていません。
色々試した結果、Sの始めを"eraser"にしたときのみ上記のエラーが出ます。
自分ではどの場合にout_of_rangeになっているのか分かりませんでした。
補足情報(FW/ツールのバージョンなど)
C++ (GCC 9.2.1)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/11 06:52