spoj(模糊排列)

时间:2015-03-29 13:24:17

标签: c++

我正在解决一个名为Ambiguous Permutations(http://www.spoj.com/problems/PERMUT2/)的spoj上的一个简单问题,当我测试小输入时它工作正常,但在提交时它显示运行时错误 - 分段错误。我无法弄明白(尽管我已经浪费了很多时间,而且只会感到沮丧)。请帮忙。

#include <iostream>
#include <stdlib.h>
#include <string.h>

char arr1[200000];//stores original string.
char arr2[200000];//stores inverse permutation.

long int n;

using namespace std;

int main()
{
    while (1)
    {
        cin >> n;
        if (n == 0)
        {
            exit(0);
        }
        getchar();
        gets(arr1);
        //creating inverse permutation.
        for (long int i = 0; i < 2 * n - 1; i++)
        {
            if (i % 2 == 1)
            {
                arr2[i] = ' ';
            }
            else
            {
                arr2[2 * (arr1[i] - '0') - 2] = i / 2 + '1';
            }
        }
        arr2[2 * n - 1] = '\0';
        //comparing string with it's inverse permutation.
        if (strcmp(arr1, arr2) == 0)
        {
            cout << endl << "ambiguous";
        }
        else
        {
            cout << endl << "not ambiguous";
        }
    }
    return 0;

}

1 个答案:

答案 0 :(得分:1)

问题是您使用char数组来表示整数,并且您的代码假定每个数字由一个char表示(注意例如检查i % 2 == 1以确定数字或空格)。
因此,任何大于9的数字都会导致正确/记忆问题。

如果你将使用整数数组,那将会容易得多。

你将不再担心空格字符' ',不需要从单元格中减少'0'个字符,并且不需要你的循环运行到2 * n - 1

我认为这样更清楚:

#include <iostream>

using namespace std;

const int MAX_SIZE = 1000;

int arr1[MAX_SIZE];
int arr2[MAX_SIZE];
int size = 0;

bool areArrsEqual()
{
    for (int i = 0; i < size; ++i)
    {
        if (arr1[i] != arr2[i])
        {
            return false;
        }
    }
    return true;
}

int main()
{
    cin >> size;

    while (size > 0 && size <= MAX_SIZE)
    {
        for (int i = 0; i < size; ++i)
        {
            cin >> arr1[i];
        }

        // creating inverse permutation.
        for (int i = 0; i < size; i++)
        {
            // if (arr[i] - 1 >= size) ==> illegal input.
            arr2[arr1[i] - 1] = i + 1;
        }

        // comparing permutation with it's inverse permutation.
        if (areArrsEqual())
        {
            cout << "ambiguous" << endl;
        }
        else
        {
            cout << "not ambiguous" << endl;
        }
        cin >> size;
    }
    return 0;
}

输出:

  

4
  1 4 3 2
  暧昧
  5
  2 3 4 5 1
  没有暧昧的   1
  1
  暧昧
  13个
  1 2 3 4 5 6 7 8 9 10 11 12 13
  暧昧
  0