POJ 3630 Phone List

链接

http://poj.org/problem?id=3630


大意

给定一些串,判断是否有一个串是另一个串的前缀


思路

比较容易想到 h a s h hash hash,但这是 O ( n 2 ) O(n^2) O(n2)的,空间也受不了,于是就可以用到 T r i e Trie Trie

对于每个新增进来的字符串,判断是否可以沿 T r i e Trie Trie到达,如果可以表明是前缀,注意判断完全相等的情况


代码

#include<cstdio> 
#include<cstring>
using namespace std;
const int N=100005;
int ch[N][10],T,n,tot;
bool end[N],ok;
char s[30];
inline bool insert(char *s)
{
	int len=strlen(s),p=1;bool flag=false;
	for(register int i=0;i<len;i++)
	{
		int c=s[i]-48;
		if(!ch[p][c]) ch[p][c]=++tot;else if(i==len-1) flag=true;//完全相等
		p=ch[p][c];
		if(end[p]) flag=true;//中途可以到达
	}
	end[p]=true;//记得标记
	return flag;//返回
}
signed main()
{
	scanf("%d\n",&T);
	while(T--)
	{
		memset(ch,0,sizeof(ch));
		memset(end,0,sizeof(end));
		scanf("%d\n",&n);
		tot=1;ok=false;
		for(register int i=1;i<=n;i++)
		{
			gets(s);
			ok|=insert(s);
		}
		if(ok) puts("NO");
		else puts("YES");
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值