ひとりも見捨てないことを、あきらめない

学校教育、社会教育、数学、技術家庭科、Youtube、EdTech、ICT、プログラミング、その他

メモリ不足。とほほ。11/09 土

「初心者用の問題」を解いていたのですが、再帰的な関数を使用するような問題で、単純に文字列を引数に用いたところ、あっという間にメモリ不足になりました。

f:id:takase_hiroyuki:20191109153938p:plain


これじゃあだめですよね。ちなみに、プログラムは次のとおり。


#include <bits/stdc++.h>
using namespace std;

int kensa(string tmp,int num) {
 string s2,s3,s4;
 int res;

 if (tmp == "") {
  return 1;
 }
 
 // case "dream"
 s2 = tmp.substr(0,5);
 if (tmp.substr(0,5) == "dream" ) {
  res = kensa( tmp.substr(5), num+1);
 }
 if (res == 1) return 1;

 // case "dreamer"
 s2 = tmp.substr(0,7);
 if (tmp.substr(0,7) == "dreamer" ) {
  res = kensa( tmp.substr(7), num+1);
 }
 if (res == 1) return 1;

 // case "erase"
 s2 = tmp.substr(0,5);
 if (tmp.substr(0,5) == "erase" ) {
  res = kensa( tmp.substr(5), num+1);
 }
 if (res == 1) return 1;

 // case "eraser"
 s2 = tmp.substr(0,6);
 if (tmp.substr(0,6) == "eraser" ) {
  res = kensa( tmp.substr(6), num+1 );
 }
 if (res == 1) return 1;

 return 0;
}

int main() {
 int res;
 string S;
 cin >> S;

 res = kensa(S,1);

 if (res==1) {
  cout << "YES" << endl;
 } else {
  cout << "NO" << endl;
 }
}

冒頭の kensa 関数で、文字列を引数にしているので、うまくいきません。文字列のポインタを引数にするように、これから変更します。