POJ-1056(Trie)

题目:http://poj.org/problem?id=1056

题意:判断一组字符串中是否有两个串A和串B,且A是B的前缀,通过将串依次插入Trie即可判断当前串是否是前面串的前缀,和前面串是否有当前串的前缀。


#include <cstdio>
#define MAX_N	200005

int N, NEX;
struct Node{
	Node* ch[2];
	bool isLeaf(){
		return !ch[0] && !ch[1];
	}
} nodes[MAX_N], *root;
Node* newNode(){
	nodes[NEX].ch[0] = nodes[NEX].ch[1] = NULL;
	return nodes + NEX++;
}

bool insert(Node* p, const char* s)
{
	bool newed = false;
	for(; *s; ++s){
		Node*& q = p->ch[*s - '0'];
		if(!q){
			q = newNode();
			newed = true;
		}
		else if(!newed && q != root && q->isLeaf()) return true;
		p = q;
	}
	return !newed;
}

int main()
{
	int kase = 0;
	char s[12];
	bool foundPrefix;
	while(gets(s)){
		++kase;
		NEX = 0;
		root = newNode();
		foundPrefix = false;
		for(; s[0] != '9' && !foundPrefix; gets(s)) foundPrefix = insert(root, s);
		while(s[0] != '9') gets(s);
		if(foundPrefix) printf("Set %d is not immediately decodable\n", kase);
		else printf("Set %d is immediately decodable\n", kase);
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值