#python #c #suffix-tree #sorteddictionary
#python #c #дерево суффиксов #sorteddictionary
Вопрос:
Добрый день. Я пытаюсь переписать код с C на python, но получаю ключевую ошибку: 0 в последних строках: для c в диапазоне (256): link [0] [c] = 1;
Я просмотрел пример добавления значения к SortedDict: sd [‘c’] = 3, однако я не могу понять, что я делаю не так.
Что нужно исправить?
#include <string>
#include <map>
const int MAXLEN = 600000;
std::string s;
int pos[MAXLEN], len[MAXLEN], par[MAXLEN];
std::map<char,int> to[MAXLEN], link[MAXLEN];
int sz = 2;
int path[MAXLEN];
void attach(int child, int parent, char c, int child_len)
{
to[parent][c] = child;
len[child] = child_len;
par[child] = parent;
}
void extend(int i)
{
int v, vlen = s.size() - i, old = sz - 1, pstk = 0;
for (v = old; !link[v].count(s[i]); v = par[v]) {
vlen -= len[v];
path[pstk ] = v;
}
int w = link[v][s[i]];
if (to[w].count(s[i vlen])) {
int u = to[w][s[i vlen]];
for (pos[sz] = pos[u] - len[u]; s[pos[sz]] == s[i vlen]; pos[sz] = len[v]) {
v = path[--pstk];
vlen = len[v];
}
attach(sz, w, s[pos[u] - len[u]], len[u] - (pos[u] - pos[sz]));
attach(u, sz, s[pos[sz]], pos[u] - pos[sz]);
w = link[v][s[i]] = sz ;
}
link[old][s[i]] = sz;
attach(sz, w, s[i vlen], s.size() - (i vlen));
pos[sz ] = s.size();
}
int main()
{
len[1] = 1; pos[1] = 0; par[1] = 0;
for (int c = 0; c < 256; c )
link[0][c] = 1;
s = "abababasdsdfasdf";
for (int i = s.size() - 1; i >= 0; i--)
extend(i);
}
и python:
#pip install sortedcontainers
from sortedcontainers import SortedDict
MAXLEN = 600000
s = ""
#pos = []
#leng = []
#par = []
pos = [None]*MAXLEN
leng = [None]*MAXLEN
par = [None]*MAXLEN
to = SortedDict()
link = SortedDict()
sz = 2
path = []
def attach(child, parent, c, child_len):
to[parent][c] = child
leng[child] = child_len
par[child] = parent
def extend(i):
vlen = len(s) - i
old = sz - 1
pstk = 0;
v = old
while 1:
if link[v].count(s[i]):
break
vlen -= leng[v]
path[pstk 1] = v
v = par[v]
w = link[v][s[i]]
if to[w].count(s[i vlen]):
u = to[w][s[i vlen]]
pos[sz] = pos[u] - leng[u]
while 1:
if s[pos[sz]] != s[i vlen]:
break
v = path[pstk - 1]
vlen = leng[v]
pos[sz] = leng[v]
attach(sz, w, s[pos[u] - leng[u]], leng[u] - (pos[u] - pos[sz]))
attach(u, sz, s[pos[sz]], pos[u] - pos[sz])
w = link[v][s[i]] = sz 1
link[old][s[i]] = sz
attach(sz, w, s[i vlen], len(s) - (i vlen))
pos[sz 1] = len(s)
leng[1] = 1;
pos[1] = 0;
par[1] = 0;
for c in range(256):
link[0][c] = 1;
s = "abababasdsdfasdf";
i = len(s) - 1;
while 1:
if i <= 0:
break
extend(i)
i -= 1
Комментарии:
1. Похоже, должно было быть инициализировано: link [0] = [None] * 256