算法竞赛模板 字典树
①找符合某前缀的字符串个数
#include<bits/stdc++.h> #define MAX 26 using namespace std; typedef struct Node{ int sum; Node*next[MAX]; Node():sum(0){} }; //初始化 void init(Node*node) { for(int i=0;i<MAX;i++) node->next[i]=NULL; } //插入单词 void Insert(Node*root,char*ch) { Node*p=root; while(*ch) { int index=*ch-'a'; if(p->next[index]==NULL) { p->next[index]=new Node; init(p->next[index]); } p=p->next[index]; p->sum++; ch++; } } //建树 Node*TrieCreate() { char str[55]; Node*root=new Node; init(root); while(gets(str)&&strlen(str)) { Insert(root,str); } return root; } //查找 int TrieSearch(Node*root,char*ch) { Node*p=root; int sum=0; while(*ch) { int index=*ch-'a'; if(p->next[index]==NULL) return 0; p=p->next[index]; sum=p->sum; ch++; } return sum; } //释放空间 void Free(Node*root) { for(int i=0;i<MAX;i++) if(root->next[i]!=NULL) Free(root->next[i]); free(root); } int main() { char str[55]; int num=0; Node*root=TrieCreate(); while(scanf("%s",str)!=EOF) { cout<<TrieSearch(root,str)<<endl; } Free(root); return 0; }
②找是否存在一个字符串是由其他两个字符串拼接而成,若有则输出
#include<bits/stdc++.h> #define MAX 26 using namespace std; char s[50005][55]; int num; typedef struct Node{ bool ok; Node*next[MAX]; }; //初始化 void init(Node*node) { for(int i=0;i<MAX;i++) node->next[i]=NULL; } //插入单词 void Insert(Node*root,char*ch) { Node*p=root; while(*ch) { int index=*ch-'a'; if(p->next[index]==NULL) { p->next[index]=new Node; init(p->next[index]); p->next[index]->ok=false; } p=p->next[index]; ch++; } p->ok=true; } //建树 Node*TrieCreate() { char str[55]; num=0; Node*root=new Node; init(root); while(gets(str)&&strlen(str)) { strcpy(s[num++],str); Insert(root,str); } return root; } //查找 bool TrieSearch(Node*root,char*ch) { Node*p=root; while(*ch) { int index=*ch-'a'; if(p->next[index]==NULL||!p) return false; p=p->next[index]; ch++; } return p->ok; } //释放空间 void Free(Node*root) { for(int i=0;i<MAX;i++) if(root->next[i]!=NULL) Free(root->next[i]); free(root); } int main() { char str[55]; int i,j; Node*root=TrieCreate(); for(i=0;i<num;i++) { for(j=1;j<strlen(s[i]);j++) { char str1[55]={'\0'},str2[55]={'\0'}; strncpy(str1,s[i],j); strncpy(str2,s[i]+j,strlen(s[i])-j); if(TrieSearch(root,str1)&&TrieSearch(root,str2)) { printf("%s\n",s[i]); break; } } } Free(root); return 0; }