POJ 3630 Phone List

版权声明:虽然本蒟蒻很菜,但各位dalao转载请注明出处谢谢。 https://blog.csdn.net/xuxiayang/article/details/83756539

链接

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


大意

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


思路

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

对于每个新增进来的字符串,判断是否可以沿 T r i e 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");
	}
}

猜你喜欢

转载自blog.csdn.net/xuxiayang/article/details/83756539