题目链接:
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;
}