数组静态版
int ch[maxnode][sigma_size];
int val[maxnode];
int sz;
void init()
{
sz = 1;
memset(ch[0], 0, sizeof(ch[0]));
}
int idx(char c)
{
return c - 'a';
}
void insert(char *s)
{
int u = 0, n = strlen(s);
for(int i = 0; i < n; i++)
{
int c = idx(s[i]);
if(!ch[u][c])
{
memset(ch[sz], 0, sizeof(ch[sz]));
val[sz] = 0;
ch[u][c] = sz++;
}
u = ch[u][c];
}
val[u] = 1;
}
void find(char *s)
{
int u = 0, n = strlen(s);
for(int i = 0; i < n; i++)
{
printf("%c", s[i]);
int c = idx(s[i]);
u = ch[u][c];
if(val[u] == 1)
break;
}
}
链表动态版
struct node
{
int val;
node *next[26];
node()
{
val = 0;
for(int i = 0; i < 26; i++)
next[i] = NULL;
}
};
node *root = new node;
void insert(char *s)
{
int n = strlen(s);
node *curr = root;
for(int i = 0; i < n; i++)
{
int c = s[i] - 'a';
if(curr->next[c] == NULL)
{
node *newnode = new node;
curr->next[c] = newnode;
}
curr = curr->next[c];
curr->val++;
}
}
void find(char *s)
{
int n = strlen(s);
node *curr = root;
for(int i = 0; i < n; i++)
{
int c = s[i] - 'a';
if(curr->next[c] == NULL)
return;
curr = curr->next[c];
}
}
左儿子右兄弟
int head[maxnode];
int next[maxnode];
int val[maxnode];
char ch[maxnode];
int sz;
void insert(char *s)
{
int n = strlen(s);
int u = 0, v;
for(int i = 0; i <= n; i++)
{
for(v = head[u]; v; v = next[v])
if(s[i] == ch[v])
break;
if(!v)
{
v = sz++;
val[v] = 0;
ch[v] = s[i];
next[v] = head[u];
head[u] = v;
head[v] = 0;
}
val[u]++;
u = v;
}
}