POJ 3630 字典树

//考察点,字典树
//思路:建立字典树,主要需要进行两点判断:1.如果先插入911,再插入91125426的时候,只需判断如果is_word为true的时候表示为前缀
//2.如果先插入91125426再插入911的话,只需判断是否有新建的节点,如果没有,表示存在前缀
//提交情况:TLE 多次,原因:使用动态分配的,new比较费时
//收获:需要考虑全面一下
//AC code
//10308326	c00h00g	3630	Accepted	2488K	157MS	C++	935B	2012-06-09 01:13:03
#include<stdio.h>
#include<string.h>

int root,loc;
bool is_prefix;
char ch[12];
struct trie_node{
	bool is_word;
	int child[10];
};
trie_node nd[100005];
//需要在插入的过程中判断
void trie_insert(char* str){
	int p=root;
	bool is_new_created=false;
	for(int i=0;i<strlen(str);i++){
		if(!nd[p].child[str[i]-'0']){
			is_new_created=true;
			nd[p].child[str[i]-'0']=++loc;
			nd[loc].is_word=false;
			memset(nd[loc].child,0,sizeof(nd[loc].child));
		}
		p=nd[p].child[str[i]-'0'];
		if(nd[p].is_word)
			is_prefix=true;
	}
	if(is_new_created==false)
		is_prefix=true;
	nd[p].is_word=true;
}


int main(){
	int N,n;
	scanf("%d",&N);
	while(N--){
		root=loc=1;
		memset(nd[1].child,0,sizeof(nd[1].child));
		is_prefix=false;
		scanf("%d",&n);
		while(n--){
			scanf("%s",ch);
			if(!is_prefix)
				trie_insert(ch);
		}
		if(is_prefix)
			printf("NO\n");
		else
			printf("YES\n");
	}
	return 0;
}

你可能感兴趣的:(c,struct,insert)