POJ-3630(静态trie树,动态分配空间会TLE)(Phone List)

原创 2012年03月27日 14:10:41

自己写了个动态的trie被tle了,悲剧

此题还能够先排序,然后用strncmp就可以判断字符串是否被后面的包含。

代码如下:

bool cmp(char *x,char *y)
{
	return strcmp(x,y)<0;
}
int main()
{
	int cases,number,x,i,j,flag;
	char **d=new char*[10000];
	for(i=0;i<10000;++i)
		d[i]=new char[10];
	scanf("%d",&cases);
	while(cases--)
	{
		scanf("%d",&number);
		for(i=0;i<number;++i)
			scanf("%s",d[i]);
		sort(d,d+number,cmp);
		flag=0;
		for(i=0;i<number;++i)
			if(strncmp(d[i],d[i+1],strlen(d[i])<strlen(d[i+1])?strlen(d[i]):strlen(d[i+1]))==0)
			{
				flag=1;
				break;
			}
		if(flag==0)
			printf("YES\n");
		else
			printf("NO\n");
	}
	return 0;
}


trie代码如下:

/*==========================================================*\
| 静态trie
\*==========================================================*/
struct my
{
	int x, y;//x记录tree的下标,y记录出现的次数
};
struct trie
{
	my next[15];
	int cnt;
} tree[100000];
struct phone
{
	char s[15];
} p[10005];
bool cmp(phone a, phone b)
{
	return strlen(a.s) > strlen(b.s);
}
int Index;
void make_tree(char s[])
{
	int i, l = strlen(s);
	int now = 0;
	for (i = 0; i < l; ++i) {
		int v = s[i] - '0';
		if (tree[now].next[v].x == 0) {			
			tree[now].next[v].x = ++Index;
			tree[now].next[v].y = 1;
			now = Index;
		} else {			
			tree[now].next[v].y++;
			now = tree[now].next[v].x;
		}
	}
}
bool search(char s[])
{
	int i, l = strlen(s);
	int now = 0;
	for (i = 0; i < l; ++i) {
		int v = s[i] - '0';
		if (tree[now].next[v].y == 1) {
			return false;
		} else {
			now = tree[now].next[v].x;
		}
	}
	return true;
}
int main()
{
	int t;
	scanf("%d", &t);
	while (t--) {
		int n;
		scanf("%d", &n);
		int i, j;
		Index = 0;
		memset(tree, 0, sizeof(tree));
		for (i = 0; i < n; ++i) {
			scanf("%s", p[i].s);
			make_tree(p[i].s);
		}
		for (i = 0; i < n; ++i) {
			if (search(p[i].s) == true) {
				printf("NO\n");
				break;
			}
		}
		if (i == n)
			printf("YES\n");
	}
	return 0;
}


Trie树实现多模匹配算法的进一步优化

之前写过一篇关于Trie树实现多模匹配算法的文章
  • u010189459
  • u010189459
  • 2014年06月20日 23:45
  • 1010

c语言动态与静态分配内存空间的区别

c语言动态与静态分配内存空间的区别 2006-05-13 23:06:57 所谓动态内存分配就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法...
  • yuhaibin168
  • yuhaibin168
  • 2013年06月11日 17:49
  • 3293

【Trie】Trie字典树模板 静态指针池、数组写法

字典树模板 静态指针池、数组写法
  • u012325552
  • u012325552
  • 2014年12月19日 15:42
  • 1457

三叉搜索树(Ternary Search Trie)和中文分词原理分析

三叉搜索树(Ternary Search Trie) 三叉搜索树是二叉搜索树和数字搜索树的混合体。它有和数字搜索树差不多的速度但是只需要和二叉搜索树一样相对较少的内存空间。在一个三叉搜索树中,每一个...
  • sg_0504
  • sg_0504
  • 2013年12月30日 23:53
  • 3935

C++如何实现类对象只能动态分配或只能静态分配

C++如何实现类对象只能动态分配或只能静态分配 C++中建立类的对象有两种方式: (1)静态建立,例如 A a;      静态建立一个类对象,就是由编译器为对象在栈空间中分配内存。使用这种方法,...
  • YF_Li123
  • YF_Li123
  • 2017年07月11日 09:11
  • 571

Trie树(Prefix Tree)介绍

本文用尽量简洁的语言介绍一种树形数据结构 —— Trie树。一、什么是Trie树Trie树,又叫字典树、前缀树(Prefix Tree)、单词查找树 或 键树,是一种多叉树结构。如下图: 上图是...
  • lisong694767315
  • lisong694767315
  • 2015年05月09日 01:49
  • 7783

Trie树的常见应用大总结(面试+附代码实现)

(一)Trie的简介 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树。他的核心思想是空间换时间,空间消耗大...
  • NK_test
  • NK_test
  • 2015年08月21日 16:18
  • 6607

用二叉树实现Trie树

关于Trie树的简介,有点这里就不再罗嗦了,清
  • u010189459
  • u010189459
  • 2014年06月16日 23:48
  • 758

hihocoder题目 trie树 编程总结

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮...
  • wangxinyao318
  • wangxinyao318
  • 2014年10月19日 15:42
  • 574

double-array-trie双数组trie树原理解析和数据构建过程

本文主要是对double-array实际实现时的一些概念和逻辑进行自己的解释, 有误请指点. coolkissmile@gmail.com trie树的作用 常用的高效查询检索数据结构 doubl...
  • kissmile
  • kissmile
  • 2015年08月11日 11:47
  • 4710
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ-3630(静态trie树,动态分配空间会TLE)(Phone List)
举报原因:
原因补充:

(最多只允许输入30个字)