HDU 1671 : Phone List

本文介绍了一种利用字典树(Trie)来判断字符串集合中是否存在互为前缀的情况的方法。通过构建字典树并标记字符串结尾,可以在插入新字符串时检查是否已有其前缀或它本身作为其他字符串的前缀。

字典树问题
插入每个字符串前,先判断前面某个字符串是不是该字符串的前缀,或者该字符串是不是前面某个字符串的前缀
详细请看代码:

#include<cstdio>
#include<cstring>
using namespace std;

const int maxn=100000+100;

int trie[maxn][10],tot;
bool vis[maxn];

inline void insert(char* ch){
	
	int len=strlen(ch);
	int root=0;
	for(int i=0;i<len;i++){
		
		int ind=ch[i]-'0';
		if(!trie[root][ind]) trie[root][ind]=++tot;
		root=trie[root][ind];  
	}
	vis[root]=true;  //字符串结尾标记
}

inline bool search(char* ch){
	
	int len=strlen(ch);
	int root=0;
	for(int i=0;i<len;i++){
		
		int ind=ch[i]-'0';
		if(!trie[root][ind]) return false;
		root=trie[root][ind];
		if(vis[root]) return true;//前面某个字符串是该字符串的前缀
	}
	for(int i=0;i<=9;i++) if(trie[root][i]) return true; //该字符串是前面某个字符串的前缀
	return false;
}

int main(){
	
	int T,n;
	bool istrue;
	scanf("%d",&T);
	char ch[20];
	while(T--){
		
		tot=0;
		memset(trie,0,sizeof(trie));
		memset(vis,false,sizeof(vis));
		istrue=true;
		scanf("%d",&n);
		getchar();
		for(int i=1;i<=n;i++){
			
			scanf("%s",ch);
			if(!istrue) continue;
			if(search(ch)) istrue=false;
			insert(ch);
		}
		if(istrue) printf("YES\n");
		else printf("NO\n");
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ITKaven

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值