POJ 3630 Phone List
阿新 • • 發佈:2018-12-13
連結
http://poj.org/problem?id=3630
大意
給定一些串,判斷是否有一個串是另一個串的字首
思路
比較容易想到 ,但這是 的,空間也受不了,於是就可以用到
對於每個新增進來的字串,判斷是否可以沿 到達,如果可以表明是字首,注意判斷完全相等的情況
程式碼
#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");
}
}