HDU 1671 Phone List(辞書ツリーを削除する必要があります.そうしないとMemory Limit Exceeded)
簡単な辞書ツリーの問題ですが、この問題には複数のテスト例があるので、作成されるたびに辞書ツリーが削除され、最初は削除されず、メモリが8 MBを超えています.
delete操作を追加するとメモリ使用量が39 MBから3320 Kに減少しました
削除するのは再帰で、Discussの中の方法を参考にするので、前に自分で再帰で书くのではありませんて、とても面倒で、効果もよくなくて、ここでコードの学友を分かち合うことにお礼を言いました
次はACのコードです.
delete操作を追加するとメモリ使用量が39 MBから3320 Kに減少しました
削除するのは再帰で、Discussの中の方法を参考にするので、前に自分で再帰で书くのではありませんて、とても面倒で、効果もよくなくて、ここでコードの学友を分かち合うことにお礼を言いました
次はACのコードです.
// hdu1671
#include <stdio.h>
#include <string.h>
struct node{
bool is_over;
node * child[10];
int child_num;
node(){
is_over = false;
child_num = 0;
memset(child, 0, sizeof(child));
}
};
bool add(char * str, node * next)
{
bool mark = false;
while(*str)
{
if(next->child[*str-'0'] == NULL)
{
next->child[*str-'0'] = new node();
next->child_num++;
mark = true;
}
next = next->child[*str-'0'];
if(next->is_over)
return false;
str++;
}
next->is_over = true;
if(mark == false)
return false;
return true;
}
void delete_tree(node * root)
{
//
for(int i=0; i<10; i++)
if(root->child[i] != NULL)
delete_tree(root->child[i]);
delete root;
}
int main(void)
{
//freopen("E:\\input.txt", "r", stdin);
int n;
char str[13];
scanf("%d", &n);
while(scanf("%d", &n) != EOF)
{
node * root = new node();
int i;
for(i=0; i<n; i++)
{
scanf("%s", str);
if(add(str, root) == false)
{
puts("NO");
break;
}
}
if(i < n-1)
{
i = n-1-i;
while(i--) scanf("%s", str);
}
else if(i == n)
puts("YES");
delete_tree(root);
}
return 0;
}