我正在解决这个problem on CodinGame.com并且我设法编写了一个代码,该代码通过了最后一个测试用例(a very large test case)的系统测试。但是在我的笔记本电脑上编译我得到的输出为0而不是57330892800,代码从他们的机器给我。我用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;
}
答案 0 :(得分:6)
我认为我已经设法将您的代码删除到最小程序:
#include<iostream>
#include<string>
using namespace std;
int main(){
string word;
cin>>word; // or getline(cin, word);
cout << word.size() << endl;
}
测试用例输入文件的结果:
test=4
),它会打印9884
(按预期方式)。prog
”的二进制文件之后:
./prog
然后将文件中的文本复制粘贴到控制台,则会打印4095
(错误)。./prog < Test_4_input.txt
,则打印9884
(好)。我认为你做的相当于1.(从你的IDE启动程序并将文本粘贴到其“控制台”选项卡中)而Codingame“的工作方式类似于”2.因此你得到了这里描述的问题:{{ 3}}(读取缓冲区的大小限制似乎为4096字节(并使用最后一个作为换行符,因此截断为4095)。
编辑:至于我是怎么发现的:
和你一样,我开始在IDE(Eclipse)中运行程序并将文件内容复制粘贴到嵌入式输入控制台中,结果我也得到了0
。所以我开始调整代码并在IDE中调试它。
我首先在decode
的第一行添加了一个全局计数器(初始化为0),并在main
的末尾打印,以查看功能被称为。其最终值在Codingame上为1254
,但在我的IDE中仅为541
所以我在增量(条件:计数器== 541)之后的decode
中设置了条件断点,启动了调试器并且介入了代码,并且看到了循环提前结束。然后我观看了本地变量,我注意到word
有一个size
4095
。我发现它“有趣”,因为它是4096减1而4096
是2的幂;你知道,就像你看到255
时一样
所以我打开了一个文本编辑器,只复制粘贴输入文件的第一行,看到它的长度不是4095而是9884.现在我开始意识到这个问题了。所以我将代码剥离到上面显示的最小测试用例,然后切换到命令行终端进行检查(看到Codingame使用solution < in$test.txt
显示Bash测试脚本),并在网上搜索了一下以查找一些类似问题的引用(如上面的链接问题)。 “拼图解决了。”
希望这有助于您自己解决未来的问题:)
答案 1 :(得分:0)
我认为在你的情况下,启动== 0和mem [start] == 0所以解码在第一次调用时返回0。
将以下两行放在解码函数的开头,检查是否是这种情况:
cout << start;
if(mem[start] != -1) return mem[start];