我的程序中出现了bad_alloc异常。

这些是约束:

  • 1
  • 每个字符串的长度最多为100000,并且仅包含小写字符。

  • 有了这些限制,我无法弄清楚为什么我的程序得到了bad_alloc
    #include <string>
    #include <algorithm>
    #include <iostream>
    #include <vector>
    
    class SuffixArray {
        std::vector<std::string> suffixes;
        size_t N;
    public:
        SuffixArray(std::string& s) {
            N = s.length();
            suffixes.resize(N);
            for (size_t i = 0; i < N; i++)
                suffixes[i] = s.substr(i);
            std::sort(suffixes.begin() , suffixes.end());
        }
        ~SuffixArray() {
        }
        size_t lcp(std::string& s, std::string& t) {
            size_t N = std::min(s.length(), t.length());
            for (size_t i = 0; i < N; i++)
                if (s[i] != t[i])
                    return i;
            return N;
        }
    };
    
    int main ( int argc, char **argv) {
        int T;
        std::cin >> T;
        std::vector<size_t> results;
    
        for ( int i = 0; i < T; i++) {
            std::string str;
            std::cin >> str;
            SuffixArray sa(str);
            size_t sol = 0;
    
            for ( std::string::iterator it = str.begin(); it != str.end(); ++it) {
                std::string target = std::string(it, str.end());
                sol += sa.lcp(str, target);
            }
            results.push_back(sol);
        }
        for ( std::vector<size_t>::iterator it = results.begin(); it != results.end(); ++it)
            std::cout << *it << std::endl;
        results.clear();
    
        return 0;
    }
    

    最佳答案

    因为您在这里做什么:

      for (size_t i = 0; i < N; i++)
            suffixes[i] = s.substr(i);
    

    是:创建长度为0、1、2,...,N的N子字符串
    这些将消耗的内存总量为:1 + 2 + 3 + ... + N字节。手头上的老高斯很好,您会发现第一个N数字的总和是:N * (N + 1) / 2
    现在,如果将N设置为100,000,则将导致大约5GB的内存消耗-大于最大值。程序通常具有2GB的地址空间,除非您在64位系统上运行它。

    编辑:我不知道您要解决的问题是什么,但是您的实现似乎很奇怪:

    您永远不会使用计算出的后缀:所使用的SuffixArray的唯一功能是lcp,它不引用存储的suffixes vector 。那么,您首先需要它们是什么?

    关于c++ - 抛出 'std::bad_alloc' what()实例后终止调用:std::bad_alloc中止,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8677238/

    10-09 17:04