質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

816閲覧

AtCoderABC049C out_of_rangeの理由

tanakaaaaaa

総合スコア11

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/08/11 06:10

前提・実現したいこと

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)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

if(s.rfind(v[i])==s.size()-v[i].size()){

sがeraserで、v[i]がdreamerのとき、
rfind()で npos=-1 が返るが、右辺も -1 になるので erase()を実行してしまう

投稿2021/08/11 06:44

sigsegv

総合スコア895

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tanakaaaaaa

2021/08/11 06:52

rfind()で見つからなかったときの返り値を間違って認識していました。 分かりやすく素早い解答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問