InterviewStreet Find Strings

You are given 'n' strings w1, w2, ......, wn. Let Si denote the set of strings formed by considering all unique substrings of the string wi. A substring is defined as a contiguous sequence of one or more characters in the string. More information on substrings can be found here. Let 'S' = {S1 U S2 U .... Sn} .ie 'S' is a set of strings formed by considering all the uni

InterviewStreet查找字符串

给你'n'个字符串w1,w2,......,wn。 设Si表示通过考虑字符串wi的所有唯一子串形成的字符串集合。 子字符串被定义为字符串中一个或多个字符的连续序列。 有关子字符串的更多信息可以在这里找到。 假设'S'= {S1 U S2 U ... Sn} .ie'S'是通过考虑所有集合S1,S2,... Sn中的所有唯一字符串而形成的一组字符串。 您将收到很多查询,并且对于每个查询,您将得到一个整数'k'。 你的任务是从集

Ukkonen's algorithm for Generalized Suffix Trees

I am currently working on my own Suffix Tree implementation (using C++, but the question remains language agnostic). I studied the original paper from Ukkonen. The article is very clear so I got to work on my implementation and tried to tackle the problem for Generalized Suffix Trees. In the tree, each substring leading from a node to another is represented using a pair of integer. While thi

用于广义后缀树的Ukkonen算法

我目前正在研究自己的后缀树实现(使用C ++,但问题仍然是语言不可知的)。 我研究了Ukkonen的原文。 这篇文章非常清楚,所以我开始研究我的实现并试图解决广义后缀树的问题。 在树中,从一个节点到另一个节点的每个子串都用一对整数表示。 虽然这对于常规后缀树来说很简单,但是当多个字符串共存于同一棵树(这变成了通用后缀树)时会出现问题。 事实上,现在这样一对是不够的,我们需要另一个变量来说明我们正在使用哪个

Forbid integer conversion with precision loss

How to prevent such code from compiling? #include <vector> #include <limits> #include <iostream> #include <cstdint> int main() { std::vector<int16_t> v; v.emplace_back(std::numeric_limits<uint64_t>::max()); std::cout << v.back() << std::endl; return 0; } g++ and clang with -std=c++14 -Wall -Wextra -Werror -pedantic -Wold-style-cast -Wconv

禁止精度损失的整数转换

如何防止编译这些代码? #include <vector> #include <limits> #include <iostream> #include <cstdint> int main() { std::vector<int16_t> v; v.emplace_back(std::numeric_limits<uint64_t>::max()); std::cout << v.back() << std::endl; return 0; } g ++和clang与-std=c++14 -Wall -Wextra -Werror -pedantic -Wold-style-cast -Wconversion -Wsign-conversio

What does o(1) stand for?

I'm trying to implement the Quadratic Sieve, and i noticed i need to choose a smoothness bound B to use this algorithm. I found in the web that B also stands for exp((1/2 + o(1))(log n log log n)^(1/2)) but now my problem is o(1). Could you tell me what does o(1) stand for? Let's start with your answer: The definition of f(n) being o(1) is that limn→∞f(n)=0. That means that for all

o(1)代表什么?

我试图实现二次筛,我注意到我需要选择一个平滑边界B来使用这个算法。 我在网上发现B也代表exp((1/2 + o(1))(log n log log n)^(1/2)),但现在我的问题是o(1)。 你能告诉我o(1)代表什么? 让我们从你的答案开始: f(n)为o(1)的定义是limn→∞f(n)= 0。 这意味着对于所有ε> 0,存在Nε,取决于ε,使得对于所有n≥Nε,我们有| f(n)|≤ε。 或者用简单的英语: 符号o(1)表示“收敛到0的函数”。 这

mostly data structure to compress and search source code

Suppose you have a lot of source code (like 50GB+) in popular languages (Java, C, C++, etc). The project needs are: compressing source code to reduce disk use and disk I/O indexing it in such way that particular source file can be extracted from the compressed source without decompressing the whole thing compression time for the whole codebase is not important search and retrieval time

主要是数据结构来压缩和搜索源代码

假设你有很多流行语言(Java,C,C ++等)的源代码(比如50GB +)。 该项目的需求是: 压缩源代码以减少磁盘使用和磁盘I / O 索引它的方式是可以从压缩的源文件中提取特定的源文件而不需要解压缩整个文件 整个代码库的压缩时间并不重要 搜索和检索时间(以及搜索和检索时使用的内存)非常重要 这个答案包含潜在的答案:什么是鲜为人知,但有用的数据结构? 但是,这只是一个潜力列表 - 我不知道这些结构是如何根据

`if constexpr`, inside lambda, inside pack expansion

clang version 5.0.0 (trunk 305664) Target: x86_64-unknown-linux-gnu The following code compiles successfully: template <int... A> void f() { ([](auto) { if constexpr (A == 0) return 42; else return 3.14; }(0), ...); } int main() { f<0, 1>(); } ... but this one doesn't: template <int... A> void f() { ([](auto...) {

`如果constexpr`,在lambda里面,包内部扩展

clang version 5.0.0 (trunk 305664) Target: x86_64-unknown-linux-gnu 以下代码成功编译: template <int... A> void f() { ([](auto) { if constexpr (A == 0) return 42; else return 3.14; }(0), ...); } int main() { f<0, 1>(); } ...但这不是: template <int... A> void f() { ([](auto...) { // Variadic lambda if

Validity of pointer returned by operator

I'm implementing a two-dimensional array container (like boost::multi_array<T,2> , mostly for practice). In order to use double-index notation ( a[i][j] ), I introduced a proxy class row_view (and const_row_view but I'm not concerned about constness here) which keeps a pointer to the beginning and end of the row. I would also like to be able to iterate over rows and over elements

运算符返回指针的有效性

我正在实现一个二维数组容器(如boost::multi_array<T,2> ,主要用于练习)。 为了使用双索引表示法( a[i][j] ),我引入了一个代理类row_view (和const_row_view但我不担心const_row_view在这里),它保持指向行的开始和结束的指针。 我也想能够遍历行和单独的行内的元素: matrix<double> m; // fill m for (row_view row : m) { for (double& elem : row) { // do something with elem

The rope data structure

I was reading about the rope data structure.I am interested in building a text editor using C++ and Qt. My question is: Does built-in string manipulating functions in programming languages like C++ use the rope data structure? Or do I need to write my own code for implementing ropes so that I can perform string operations like concatenation and deletion more efficiently? std::string is not a

绳索数据结构

我正在阅读绳索数据结构。我有兴趣使用C ++和Qt构建文本编辑器。 我的问题是:C ++等编程语言中的内置字符串操作函数是否使用rope数据结构? 还是我需要编写自己的代码来实现绳索,以便我可以更有效地执行串联和删除等字符串操作? std::string不是绳子,但SGI STL提供了rope 。 如果您计划实施自己的绳索,我会建议SGI的绳索实施概述,以获取一些实施细节。

Trouble implementing a "rope" data structure in C++

I'm trying to make a rope data structure. It's a type of binary tree, ie a recursive data structure. The purpose of a rope is that splitting and concatenation should be fast, which means you avoid copying entire ropes. So, for example, a user should be able to say rope1 + rope2 and expect a result in ~logarithmic time. However, this presents a problem: If a rope is modified, its

无法在C ++中实现“绳索”数据结构

我试图制作一个绳索数据结构。 这是一种二叉树,即递归数据结构。 一根绳子的目的是分割和连接应该很快,这意味着你避免复制整条绳索。 因此,例如,用户应该能够说出rope1 + rope2并期望在〜对数时间的结果。 但是,这提出了一个问题: 如果绳子被修改,其父母也会间接修改。 因为我的目标是使rope下降的替代产品string ,这是不能接受的。 我的解决方案是:每当rope发生任何变化时,我都会创建一个新的节点,稍作

Split operation on rope data structures

I am working on implementing the Rope data structure in C++ for completely abstract objects. The problem I am having is that I can't figure out the implementation of the critical "split" operation. The Wikipedia page is helpful, but vague and highly theoretical, and the images attached to the text do not help my understanding of the algorithm. Is there a good implementation, or a

在绳索数据结构上拆分操作

我正在为完全抽象的对象在C ++中实现Rope数据结构。 我遇到的问题是我无法弄清楚关键“拆分”操作的实施情况。 维基百科页面是有帮助的,但含糊不清,高度理论化,附在图片上的图片无助于我对算法的理解。 是否有一个很好的实现,或提供示例代码的论文? 我曾尝试阅读原始论文,但他们也没有真正帮助。 假设我们有一个绳索结构 struct Rope { Rope *left; union { Rope *right; const char *string;