建立后的前缀树:
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=26;//26个小写字母,如果有大写,变为52
typedef struct node{
int count;
struct node *next[maxn];
}Tree;
int sum;
Tree T;
//初始化
void Init()
{
for(int i=0;i<maxn;++i)
{
T.next[i]=NULL;
}
}
//建立前缀树
void createTree(char *str)
{
Tree *p=&T;
Tree *q;
for(int i=0;i<strlen(str);++i)
{
int k=str[i]-'a';
if(p->next[k]==NULL)
{
q=new node;
q->count=1;
for(int j=0;j<maxn;++j)
{
q->next[j]=NULL;
}
p->next[k]=q;
p=p->next[k];
}
else
{
p->next[k]->count++;
p=p->next[k];
}
}
}
void calculate_()//层次遍历找叶节点
{
queue<Tree *> qu;
qu.push(&T);
while(!qu.empty())
{
Tree *p=qu.front();
qu.pop();
int son=0;
for(int i=0;i<maxn;++i)
{
int k=i;
if(p->next[k]==NULL) son++;
else
{
qu.push(p->next[k]);
}
}
if(son==maxn) sum++;//26个字母指针全为空,说明是叶节点
}
cout<<sum<<endl;
}
int main()
{
int n;
while(cin>>n)
{
if(n==0) break;
char str[21];
sum=0;
Init();
while(n--)
{
cin>>str;
createTree(str);
}
calculate_();
}
return 0;
}
后缀树也一样,将输入的字符串反序即可