CodinGame.comでこの問題を解決していたところ、最後のテスト ケース (非常に大きなテスト ケース) のシステム テストに合格するコードを書くことができました。しかし、ラップトップでコンパイルすると、コードがマシンから提供した 57330892800 の代わりに 0 の出力が得られます。Visual Studio 2012 Express と Dev C++ 4.9.9.2 の両方でコンパイルしました。
再帰関数を使用したため、スタック メモリが不足していた場合、スタック オーバーフロー エラーが発生すると予想していましたが、エラーはなく、何も出力されず、出力は 0 でした。サイトのマシン?スタックオーバーフローであるとは思えないので、これを引き起こした原因は何ですか?
#include<iostream>
#include<algorithm>
#include<stack>
#include<string>
#include<map>
#include<set>
#include<vector>
using namespace std;
typedef long long LONG;
string X[]={".-","-...","-.-.","-..",
".","..-.","--.","....",
"..",".---","-.-",".-..",
"--","-.","---",".--.",
"--.-",".-.","...","-",
"..-","...-",".--","-..-",
"-.--","--.."};
map<string, int> dict;
string morse(const string ret){
string s;
for(char c : ret) s+=X[c-'A'];
return s;
}
LONG decode(int start, string &word, vector<LONG> &mem){
if(start == word.size()) return 1;
else if(mem[start] != -1) return mem[start];
LONG res = 0;
string s;
for(int i=0; i<19*4 && start+i<word.size(); i++){
s+=word[start+i];
auto curr = dict.find(s);
if(curr!=dict.end()) res+=curr->second*decode(start+i+1, word, mem);
}
mem[start]=res;
return res;
}
int main(){
string word;
cin>>word;
int n; cin>>n;
for(int i=0; i<n; i++){
string s;
cin>>s;
dict[morse(s)]++;
}
vector<LONG> mem(word.size(), -1);
cout<<decode(0, word, mem)<<endl;
}