hdu1247 字典树模板
今天又接触了一个树:字典树。
给出结构图。
其优点:节约储存空间,提高查询效率。
其主要函数用法Insert();插入结点,用到了指针,总感觉指针用在表示前后缀这种关系上是最清晰的了。先把这份模拟别人写的代码写下当作模板!以后有时间再继续做几道字典树的题。
代码:
#include<iostream> #include<cstring> #include<cstdio> using namespace std; char str[50010][20]; struct Tree{ int num; Tree *next[26]; Tree() { num=0; for(int i=0;i<26;i++) { next[i]=NULL; } } }* root; int count; void insert(Tree *p,char *s) { int i=0; while(s[i]) { int x=s[i]-'a'; if(p->next[x]==NULL) p->next[x]=new Tree(); p=p->next[x]; i++; } p->num++; } int find(Tree *p,char *s) { int i=0,ans=0; while(s[i]) { int n=s[i]-'a'; if(p->next[n]) { p=p->next[n]; ans=p->num; i++; } else return 0; } return ans; } int main() { count=0; root=new Tree(); while(cin>>str[count++]) { insert(root,str[count-1]); } for(int i=0;i<count;i++)//暴力搜索count个单词 { int len=strlen(str[i]); int flag=0; for(int j=0;j<len;j++) { char a[20],b[20]; memset(a,'\0',sizeof(a)); memset(b,'\0',sizeof(b)); int cnt1=0;int cnt2=0; for(int k=0;k<j;k++) { a[cnt1++]=str[i][k]; } for(int k=j;k<len;k++) { b[cnt2++]=str[i][k]; } if(find(root,a)&&find(root,b)) { flag=1; break; } } if(flag)puts(str[i]); } return 0; }