Trie树,包括插入(insert)查找(find)删除(del)
这里以所有字符都是小写字母为例
val[](>0)保存单词结点的信息,值为0表示非单词结点。
本来想用-1表示非单词结点,但发现这样不方便派生AC自动机。
struct Trie
{
int ch[maxn][maxsize];
int val[maxn];
int sz;
Trie()
{
sz=1;
val[0]=0;
memset(ch[0],0,sizeof ch[0]);
}
void clear()
{
sz=1;
val[0]=0;
memset(ch[0],0,sizeof ch[0]);
}
int idx(char c)
{
return c-'a';
}
void insert(const char *s,int v=1)
{
int u=0,n=strlen(s);
for (int i=0;i<n;i++)
{
int c=idx(s[i]);
if (ch[u][c]==0)
{
memset(ch[sz],0,sizeof ch[sz]);
val[sz]=0;
ch[u][c]=sz++;
}
u=ch[u][c];
}
val[u]=v;
}
int find(const char *s)
{
int u=0,n=strlen(s);
for (int i=0;i<n;i++)
{
int c=idx(s[i]);
if (ch[u][c]==0) return -1;
u=ch[u][c];
}
return val[u];
}
void del(const char *s)
{
int u=0,n=strlen(s);
for (int i=0;i<n;i++)
{
int c=idx(s[i]);
if (ch[u][c]==0) return ;
u=ch[u][c];
}
val[u]=0;
}
};