//sigma_size=26 maxnode为节点最大数:字符串数*每个字符串最大长度+x
struct trie
{
int ch[maxnode][sigma_size];//ch[a][3]=c表示第a个节点有一个子节点为'd'并且节点序列号为c
int val[maxnode];//存各个字符串权值,题目不涉及权值时,可以存1
int sz;
int idx(char c) { return c - 'a';}//找到char c对应的id值
void init()
{
sz = 1;
memset(ch[0], 0, sizeof(ch[0]));
}
void insert(char *s, int v)//s为字符串,v为权值
{
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] = v;
}
int find(char *s)//查找s,返回权值
{
int u = 0;
for(int i = 0; s[i]; i++)
{
int c = idx(s[i]);
if(!ch[u][c]) return 0;
u = ch[u][c];
}
return val[u];
}
}Trie;
前缀数组Trie刘汝佳模板
最新推荐文章于 2022-07-10 20:49:52 发布