csu1115 最短的名字 字典树模板
2017-09-04 19:23
253 查看
一道裸的字典树,关于字典树的详细介绍还是去看百度吧,再贴一遍也没意义
下面分析,先上图:
#include<iostream> #include<cstring> #include<cstdlib> using namespace std; const int M=26; //一般是26个小写字母,可自行更改 typedef struct Trie{ Trie *next[M]; int v; //标记 h }Trie; char s[1000001]; Trie *newTrie(){ Trie *cur=(Trie*)malloc(sizeof(Trie)); for(int i=0;i<M;i++)cur->next[i]=NULL; cur->v=1; return cur; } void insert(Trie *lin,char *word){ Trie *cur=lin; for(int i=0;word[i]!='\0';i++){ if(cur->next[word[i]-'a']==NULL){ cur->next[word[i]-'a']=newTrie(); cur=cur->next[word[i]-'a']; } else{ cur=cur->next[word[i]-'a']; cur->v++; } } } void Realse(Trie *lin){ for(int i=0;i<M;i++){ if(lin->next[i]!=NULL)Realse(lin->next[i]); } free(lin); } int search(Trie *lin){ int sum=0; Trie *cur=lin; for(int i=0;i<M;i++){ if(lin->next[i]!=NULL){ cur=lin->next[i]; sum+=cur->v; if(cur->v>1)sum+=search(cur); } } return sum; } int main(){ int t; cin>>t; while(t--){ Trie *lin=(Trie*)malloc(sizeof(Trie)); for(int i=0;i<M;i++)lin->next[i]=NULL; lin->v=0; int n; cin>>n; for(int i=0;i<n;i++){ cin>>s; insert(lin,s) ; } cout<<search(lin)<<endl; Realse(lin); } return 0; }
相关文章推荐
- CSU - 1115 最短的名字(字典树模板题)
- CSU OJ 1115 最短的名字(字典树——湖南省第八届大学生计算机程序设计竞赛)
- CSU1115-最短的名字
- PowerOJ 1100 最短的名字 字典树半个模版
- swust oj 1100 最短的名字 (字典树)
- CSU 1115 最短的名字(字典树)
- csu 1115 最短的名字(字典树)解题报告
- CSU1115 最短的名字 题解
- 最短的名字+csuoj+前缀树(字典树)
- PowerOJ 1100 最短的名字 字典树
- csu1115(字典树)最短的名字
- CSU - 1115 最短的名字(字典树)
- 最短的名字 字典树
- 最短的名字(简单字典树)
- CSU 1115 湖南省第八届大学生计算机程序设计竞赛 (最短的名字[字典树])
- CSU1115——最短的名字
- Dijkstra模板(最短路径)
- 字典树模板
- 四种常用最短路径算法模板
- luoguP3371 【模板】单源最短路径