• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

  • 联系
  • 订阅
  • 管理

View Post

POJ 3630 Phone List 字典树

         今晚学了字典树,找来一题熟悉熟悉,直接套模板,一开始在Sicily过了,但在POJ 超时,囧,看了别人的解题报告,直接开个10000数组来储存节点,而不是插入时再new一个,就这样AC掉了

#include <iostream>
#include <stdio.h>
#include <memory.h>
#include <string.h>

using namespace std;

int nodenum;
bool find_prex;

struct Trie_node
{
	bool isStr;
	Trie_node *next[10];
	Trie_node()
	{
		isStr = false;
		memset(next, NULL, sizeof(next));
	}
};

Trie_node node[100000];

class Trie
{
public:
	Trie();
	void clear();
	void insert(char *);
private:
	Trie_node *root;
};

void Trie::clear()
{
	for (int i = 0; i < nodenum; i++)
	{
		node[i].isStr = false;
		memset(node[i].next, NULL, sizeof(node[i].next));
	}
}

Trie::Trie()
{
	root = &node[0];
}

void Trie::insert(char * word)
{
	//当找到一个number不符合题意的话,就不做插入操作
	if (find_prex) return;  
	
	Trie_node *p = root;

	while (*word)
	{
		//当在树中找到一个单词是插入单词的前缀时,停止查找
		if (p->isStr)
		{	
			find_prex = true; 
			return ;
		}

		if (p->next[*word-'0'] == NULL)
		{
			Trie_node *tmp = &node[nodenum];
			p->next[*word-'0'] = tmp;
			nodenum++;
		}
		p = p->next[*word-'0'];
		word++;
	}
	//判断树中是否有元素与插入的number相同
	if (p->isStr)
		find_prex = true;

	//判断树中是否有元素的前缀是插入单词
	for (int i = 0; i < 10; i++)
		if (p->next[i] != NULL)
		{
			find_prex = true;
			return ;
		}

	p->isStr = true;
}


int main()
{
	Trie t;
	int cases, n;
	char number[11];

	cin >> cases;

	while (cases--)
	{
		nodenum = 1;
		find_prex = false;
		cin >> n;

		for (int i = 0; i < n; i++)
		{
			scanf("%s", number);
			if (!find_prex)
				t.insert(number);
		}

		if (!find_prex)
			cout << "YES" << endl;
		else
			cout << "NO" << endl;
		t.clear();
	}
}

posted on 2010-11-17 23:56  sysuwhj  阅读(553)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3