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