-1

このコードの間違いを見つけるのを手伝ってください。Aho-Corasick アルゴリズムで n 個の文字列を追加して試行する簡単なプログラムを書きましたが、正しく動作しません。文字列を入力するとクラッシュします。このコードの何が問題なのですか?

#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;
}
4

1 に答える 1

0

アルゴリズムについては何も知らないので、正しく動作しているかどうかはわかりません。trieただし、gdb を介してコードを実行することに基づいて、ベクター内の少なくとも 1 つの要素から始める必要があります。あなたは書くことによってそれを行うことができます

vector <item> trie(1);

ここで、1は、ベクトルを開始する要素の数を示します。その変更により、コードは正常に実行されます (ただし、アルゴリズムが正しく実行されているかどうかはわかりません)。

于 2013-03-23T15:50:46.690 に答える