字典树(需要删除操作)——DNA Prefix ( LOJ 1224 )
2016-07-15 18:48
309 查看
题目链接:
http://www.lightoj.com/volume_showproblem.php?problem=1224
分析:
一开始以为是一道非常裸的字典树,只不过加了个前缀×节点值,后来内存超了几次,才发觉每次需要删除字典树。
关键步骤:
1.删除字典树代码:
2.递归search求出前缀×节点值:
AC代码:
http://www.lightoj.com/volume_showproblem.php?problem=1224
分析:
一开始以为是一道非常裸的字典树,只不过加了个前缀×节点值,后来内存超了几次,才发觉每次需要删除字典树。
关键步骤:
1.删除字典树代码:
void delete_tree(node * root) { //递归删除 for(int i=0; i<k; i++)//k表示每一个节点含有的子节点数目 if(root->childs[i] != NULL) delete_tree(root->childs[i]); delete root; }
2.递归search求出前缀×节点值:
void search(int level, node *cur) { //递归search,level表示当前层数 for(int i=0; i<5; i++) { if(cur->childs[i] !=NULL) { level++; search(level, cur->childs[i]); level--;//恢复现场 } //cout << level*cur->count << endl; ans = max(ans, level*cur->count);//比较每个节点求出的值,取最大的那个 } return; }
AC代码:
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> using namespace std; struct node { int count; node *childs[5]; node() { count=0; int i; for(i=0;i<5;i++) childs[i]=NULL; } }; node* root; node *current,*newnode; int judge(char a) { switch(a) { case 'A': return 1; case 'C': return 2; case 'G': return 3; case 'T': return 4; } } void insert(char *str) { int i,m; current=root; for(i=0;i<strlen(str);i++) { m=judge(str[i]); if(current->childs[m]!=NULL) { current=current->childs[m]; ++(current->count); } else { newnode=new node; ++(newnode->count); current->childs[m]=newnode; current=newnode; } } } int ans; void search(int level, node *cur) { //cout << cur->count<<endl; for(int i=0; i<5; i++) { if(cur->childs[i] !=NULL) { level++; search(level, cur->childs[i]); level--; } //cout << level*cur->count << endl; ans = max(ans, level*cur->count); } return; } void delete_tree(node * a) { //递归删除 for(int i=0; i<5; i++) if(a->childs[i] != NULL) delete_tree(a->childs[i]); delete a; } int main() { int t; cin >>t; int tt =1; while(t--) { root = new node; ans = 0; char str[66]; int num; cin >> num; for(int i=0;i<num;i++) { scanf("%s", str); insert(str); } search(0,root); cout << "Case "<<tt++<<": "<<ans << endl; delete_tree(root); } return 0; }