内存分配问题

时间:2012-10-13 13:22:36

标签: c++ runtime-error

Here是我problem的代码。代码在我的Code :: blocks上正常运行,但在spoj站点和ideone.com上没有运行。我遇到运行时错误。我猜这个spoj服务器无法分配所需的内存量。请提出一些建议。

http://paste.ubuntu.com/1277109/(我的代码)

3 个答案:

答案 0 :(得分:5)

您的代码声明了一个空字符串s,然后分配给它的元素......

...
string s,res;int c=0;
int sum,carry=0;
for(int i=m-1;i>=0;i--)
{
    sum=(a[i]-'0')*2+carry;
    s[c]=sum%10+'0';         // This is undefined behavior, s is empty
    carry=sum/10;
    c++;
}
...

答案 1 :(得分:1)

这是您problem的可能答案,而不是您的问题。

我猜这个问题具有算法的味道,其目的是找到 具有最小时间复杂度的解决方案(可能是线性时间解决方案)。 对与最佳时间复杂性相关的问题进行一些预测是有帮助的。

所以我计算了几个时间步骤产生的模式(如下所示):

step                                             pattern                         no. consecutive zero pairs

  1                                                01                                           0

  2                                               1001                                          1

  3                                             01101001                                        1

  4                                         1001011001101001                                    3

  5                                 01101001100101101001011001101001                            5

  6                 1001011001101001011010011001011001101001100101101001011001101001           11

  7                 0110100110010110100101100110100110010110011010010110100110010110           21
                    1001011001101001011010011001011001101001100101101001011001101001

  8                 1001011001101001011010011001011001101001100101101001011001101001           43
                    0110100110010110100101100110100110010110011010010110100110010110    
                    0110100110010110100101100110100110010110011010010110100110010110
                    1001011001101001011010011001011001101001100101101001011001101001

  9                 0110100110010110100101100110100110010110011010010110100110010110           85
                    1001011001101001011010011001011001101001100101101001011001101001
                    1001011001101001011010011001011001101001100101101001011001101001
                    0110100110010110100101100110100110010110011010010110100110010110
                    1001011001101001011010011001011001101001100101101001011001101001
                    0110100110010110100101100110100110010110011010010110100110010110
                    0110100110010110100101100110100110010110011010010110100110010110
                    1001011001101001011010011001011001101001100101101001011001101001

产生上述模式的代码如下:

#include<iostream>
using namespace std;
main()
{
string s,t=""; 
s="paste pattern produced in a time-step here";
int i,l,n=0;
l=s.length();
cout <<"s.length - "<<l<<endl;
    for(i=0;i<l;i++)
    {
        if(s[i]=='0')
          {t+="10";}
        else
          {t+="01";}
    }
l*=2;
        for(i=0;i<l-1;i++)
        {
            if(t[i]=='0' && t[i+1]=='0')
            {
            n+=1;
            }
        }
cout <<"t - "<<t<<endl;
cout <<"no. of consecutive zero pairs - "<<n<<endl;
}

下面提到的几个重要观察结果如下:

1)每个时间步长中的字符数是上一步的两倍。

2)在前一个时间步中,为 01 组合生成一对连续的零。

3)任何模式的后半部分都是上半年的 NOT

现在是有趣的部分。查看每个步骤生成的连续零对的数量。如果我们分配第一步的结果,则将n表示为零:

对于步骤2,我们得到的结果为n * 2 + 1,其中n为0。

对于步骤3,我们得到的结果为n * 2 - 1,其中n为1。

对于步骤4,我们得到的结果为n * 2 + 1,其中n为1.

对于步骤5,我们得到n * 2 - 1的结果,其中n是3。

或者一般来说我们的结果等于n * 2 - 1(对于奇数时间步长) 和结果等于n * 2 + 1(偶数时间步长)

这不会解决我们的问题,因为n是一个变量,我们需要 找到一个与初始结果相关的数学公式(对于时间步骤1) 并且结果在任何时间 - 步骤说t。

但我们有一条简单的出路。

查看数字0,1,1,3,5,11,21,43,85 ....

它形成Jacobsthal sequence

这是我们的解决方案。

1)浏览输入数字并找出最大值。这需要花费O(n)时间。

2)创建Jacobsthal数字的查找表(LUT),最多最大。这需要 不超过O(n)时间因为你只需要当前Jacobsthal数的前两个Jacobsthal数。从Jacobsthal数的性质可以看出这一点。

3)再次通过输入数字遍历输出相应的数字 来自LUT的序列号。查表需要O(1)时间和总时间 n个数字将是O(n)。

4)整个问题的时间复杂度为O(n)。

这种方法的一个优点是我们不必处理大字符串。

答案 2 :(得分:0)

这只是@ 6502答案的延伸。

看起来ostringstream非常适合你想要的东西。

ostringstream oss;
string s,res;
int c=0;
int sum,carry=0;

for(int i=m-1;i>=0;i--)
{
    sum=(a[i]-'0')*2+carry;
    oss << (sum%10) << '0'; //Were you trying to concatenate a '0' as well?
    carry=sum/10;
}

s = oss.str();