1. 程式人生 > >POJ 3630 Phone List

POJ 3630 Phone List

連結

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");
	}
}