您的位置:首页 > 其它

字典树(需要删除操作)——DNA Prefix ( LOJ 1224 )

2016-07-15 18:48 309 查看
题目链接:

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息