C++(GCC9.2.1)
1コード 2#include<bits/stdc++.h> 3using namespace std; 4 5int main() { 6 string S; cin >> S; bool flag = false; 7 vector<string> vec = {"dream", "dreamer", "erase", "eraser"}; 8 int i = S.size() - 1; 9 while (true) { 10 if (i <= 3) { 11 flag = true; 12 break; 13 } 14 if (S.compare(i - 4, i, vec[0]) == 0 || S.compare(i - 4, i, vec[2]) == 0) { 15 if (i == 4) 16 break; 17 i -= 5; 18 continue; 19 } 20 else if (i > 4) { 21 if (S.compare(i - 5, i, vec[3]) == 0) { 22 if (i == 5) 23 break; 24 i -= 6; 25 continue; 26 } 27 } 28 else if (i > 5) { 29 if (S.compare(i - 6, i, vec[1]) == 0) { 30 if (i == 6) 31 break; 32 i -= 7; 33 continue; 34 } 35 } 36 flag = true; 37 break; 38 } 39 if (flag) 40 cout << "NO" << endl; 41 else 42 cout << "YES" << endl; 43} 44https://atcoder.jp/contests/abc049/tasks/arc065_a 45当方プログラミングの初心者で、競技プログラミングを最近始めました。 46AtCoderの上記リンクの問題を解くためにこのプログラムを作ったのですが、全く思った通りに作動しません。 47後ろから何文字かを取り出して、当該の文字列と一致していればcontinueをして、操作を繰り返す形のプログラムにしたいのですが、そもそもcompareを使った部分文字列の一致判定が上手くいっていないようでeraserなどの簡単な入力に対してもcompareを含むif節が作動していません。 48色々自分で調べてはみたのですが、compare関数を使うのが初めてなので何か使い方を間違えているかもしれません。 49どこがバグの原因なのかご教授いただけないでしょうか…
どういうふうに動作するんでしょうか。また、それがどうなればいいという話なんでしょう。
問題が見えません
compare関数の使い方が怪しいと考えているのであれば、今一度関数の定義・使い方を確認されたのでしょうか?
確認されたのであれば、何(サイトのurlなど)を参考にしてどういう理解をしたのか質問欄に追記をお願いします。
未確認であれば、複数サイトなどで認識誤りがないか確認してその結果を質問欄に追記してください。
kazuma-sさんの回答の通り、第二引数の使い方に誤りがありました。
(比較元の文字列の0文字目、部分文字列の長さ、比較先の文字列)ではなく、(比較元の文字列の0文字目、部分文字列の最後の文字の添字、比較先の文字列)という風に誤って認識していました。
コードの具体的な使い方のみを見て、関数の使い方を自分で決めつけてしまったのが原因です。
わざわざ皆様にご指摘いただくほどのことでは無かったと思いますが、今後は今回の反省を踏まえ、関数の使い方をしっかりと確認してから使うように心がけますので、今回ばかりは手間を掛ける形となった事をお許しください…
回答2件
あなたの回答
tips
プレビュー