UVA 195变位-运行时错误- c++

UVA 195 Anagram - Runtime Error - C++

本文关键字:运行时错误 c++ 变位 UVA      更新时间:2023-10-16

我试图解决UVA 195问题,但除了测试中的准确结果外,在线法官返回"运行时错误"。

函数"fatorial"计算给定数字的阶乘。"permutacoes"函数计算给定单词的排列次数。

#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
using namespace std;
int fatorial (int a){
    int resultado = 1;
    for(int i=1; i<=a; i++) resultado *= i;
    return resultado;
}
int permutacoes (string s){
    int t = s.length();
     //conta as repetições de cada letra
    int rep[t];
    for(int i=0; i<t; i++) rep[i]=1;
    for(int i=0; i<t; i++){
        if(rep[i]==1){
            for(int j=(i+1); j<t; j++){
                if(s[i]==s[j]){
                    rep[i]++;
                    rep[j] = 0;
                }
            }
        }
    }
    //Calcula o número de permutações
    int fat = fatorial(t);
    int dividendo = 1;
    for(int i=0; i<t; i++){
            if(rep[i]>1) dividendo *= fatorial(rep[i]);
    }
    int resultado = fat/dividendo;
    return resultado;
}
int main()
{
    int n;
    string s;
    cin>>n;
    while(n--){
        cin>>s;
        sort(s.begin(),s.end()); //Ordem inicial
        cout<<s<<endl; //Primeira saída
        int perm = permutacoes(s);
        //Todas as permutações, menos a primeira que já foi dada pelo sort
        while (--perm){
            next_permutation(s.begin(),s.end());
            cout<<s<<endl;
        }
    }
    return 0;
}

问题可能出在计算排列数量的方式上。程序可能正在尝试除一些非常大的数字,但其中一个数字可能溢出(大于int的最大值),因此不正确。

用单词"aaaaaaaaaabbbbbbbb"(10个字母"a"和10个字母"b")检查你的算法。你应该得到20!/(10!*10!)=184756个排列,但我打赌你会得到一些其他的值。将程序输出重定向到一个文件,以便它更快地完成。

为了解决这个问题,去掉permutacoes函数,只要next_permutation返回true,就运行循环。当next_permutation返回false时,没有更多的排列,单词应该按照循环前的顺序排序。