学长给的字典树代码,具体以后找时间理解吧:
#include<cstdio>
#include<cstring>
#define idx(x) (x-'a')
struct Node
{
int v;
Node *next[26]; //指向某个节点,作为其子节点之一
void init()
{
v = 0; //当前节点有多少人公用
for (int i = 0 ; i < 26 ; i++)
next[i] = NULL;
}
}Trie[100000]; //事先把内存分配好了
int ant; //下一个节点要保存到的位置
void insert(char str[])
{
Node *p = &Trie[0]; //现在执行到的节点
int l = strlen(str);
for (int i = 0 ; i < l ; i++)
{
if (p->next[idx(str[i])] == NULL)
{
p->next[idx(str[i])] = &Trie[ant];
ant++;
Trie[ant].init(); //随手初始化下一个节点
Trie[ant-1].v = 1;
p = &Trie[ant-1];
}
else
{
p->v++;
p = p->next[idx(str[i])];
}
}
}
int Query(char str[]) //char *str
{
int length = 0;
Node p = Trie[0];
int l = strlen(str);
for (int i = 0 ; i < l ; i++)
{
if (p.next[idx(str[i])] == NULL) //到此节点没有公共前缀的串了
{
break;
}
else
{
length++;
p = *p.next[idx(str[i])];
}
}
return length;
}
int main()
{
int n,m;
char str[20];
while (~scanf ("%d %d",&n,&m))
{
ant = 1;
Trie[ant].init();
for (int i = 1 ; i <= n ; i++)
{
scanf ("%s",str);
insert(str); //建树
}
for (int i = 1 ; i <= m ; i++)
{
scanf ("%s",str); //m次查询,查str的最长公共前缀
printf ("%d\n",Query(str));
}
}
return 0;
}
/*
3 5
abac
abcd
accc
a
ab
abe
bc
aca
*/