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

自己写了个动态的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;
}


你可能感兴趣的:(POJ-3630(静态trie树,动态分配空间会TLE)(Phone List))