什么导致了产量的差异?

时间:2013-09-04 22:18:09

标签: c++ runtime-error

我正在解决这个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;
}

2 个答案:

答案 0 :(得分:6)

我认为我已经设法将您的代码删除到最小程序:

#include<iostream>
#include<string>

using namespace std;

int main(){
        string word;
        cin>>word; // or getline(cin, word);
        cout << word.size() << endl;
}

测试用例输入文件的结果:

  • 在Codingame上(使用test=4),它会打印9884(按预期方式)。
  • 在我的个人计算机上,在从终端命令行(控制台)将源文件编译为名为“prog”的二进制文件之后:
    1. 如果我运行./prog然后文件中的文本复制粘贴到控制台,则会打印4095(错误)。
    2. 如果我改为运行./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];