Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Aho-Corasick算法_C++_String_Aho Corasick - Fatal编程技术网

C++ Aho-Corasick算法

C++ Aho-Corasick算法,c++,string,aho-corasick,C++,String,Aho Corasick,请帮我找出这段代码中的错误。我编写了一个简单的程序,通过Aho Corasick算法将n个字符串添加到trie中,但它不能正常工作。输入字符串后它崩溃。这段代码有什么问题 #include <cstdlib> #include <iostream> #include <vector> #define ALPHABET 26 using namespace std; struct item { int next[ALPHABET];

请帮我找出这段代码中的错误。我编写了一个简单的程序,通过Aho Corasick算法将n个字符串添加到trie中,但它不能正常工作。输入字符串后它崩溃。这段代码有什么问题

#include <cstdlib>
#include <iostream>
#include <vector>
#define ALPHABET 26

using namespace std;

struct item
{
       int next[ALPHABET];
       int leaf;
       item()
       {
               for (int i = 0; i < ALPHABET; i++)
                       next[i] = -1;
               leaf = 0;
       }
};

vector <item> trie;

int add_string(string &s)
{
       int z = 0;
       item temp;
       for (int i = 0; i < s.length(); i++)
       {
              char c = s[i] - 'a';
              if (trie[z].next[c] == -1)
              {
                     trie[z].next[c] = trie.size();
                     trie.push_back(temp);}
                     z = trie[z].next[c];
              }
              trie[z].leaf = true;
       }
}

int main(int argc, char *argv[])
{
       int n;
       cin >> n;
       string s[n];
       for (int i = 0; i < n; i++)
              cin >> s[i];
       for (int i = 0; i < n; i++)
              add_string(s[i]);
       system("PAUSE");
       return EXIT_SUCCESS;
}
#包括
#包括
#包括
#定义字母表26
使用名称空间std;
结构项
{
int next[字母表];
内叶;
项目(
{
for(int i=0;i>n;
字符串s[n];
对于(int i=0;i>s[i];
对于(int i=0;i
我对算法一无所知,所以我不知道它是否正确运行。然而,仅仅基于通过gdb运行代码,您需要从
trie
向量中至少一个元素开始。你可以通过写作来做到这一点

vector <item> trie(1);
向量trie(1);

其中
1
表示向量应从多少个元素开始。有了这个更改,代码运行得很好(但我不知道它是否正确地运行了算法)。

您是否尝试过调试任何东西?它是如何崩溃的?错误消息是什么?注意:
strings[n]使用gcc ism。在C++中,数组的维数应该在编译时固定(除非动态分配),VLA(可变长度数组)严格地是C99,并且在C++中使用它们是非标准的(因此是不可移植的)。建议使用
std::vector s(n)相反。我认为你是对的。我将添加搜索功能来检查它是否有效。