我的程序中出现了bad_alloc
异常。
这些是约束:
有了这些限制,我无法弄清楚为什么我的程序得到了
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/