SP4033 PHONELST - Phone List
Trie的经典题。
考虑在插入的时候直接查询掉。
如果插入时没有新建节点,说明它是某个串的前缀
插入完在末节点打个标记。
如果插入的时候遇上了标记,说明某个串是它的前缀
跑到底就输出YES
注意不能直接 break
,读入还是要读完
#include<bits/stdc++.h>
using namespace std;
#define gc() getchar()
const int N=100005;
char s[12];
int cnt,n,ch[N][12],T,flag,en[N*12];
bool f;
int ins(char *s) {
int len=strlen(s),u=1,f=1;
for(int i=0; i<len; ++i) {
int v=s[i]-'0';
if(!ch[u][v])ch[u][v]=++cnt,f=0;
u=ch[u][v];
if(en[u])return 1;
}
en[u]=1;
return f;
}
void clear() {
memset(ch,0,sizeof(ch));
memset(en,0,sizeof(en));
cnt=1;flag=0;
}
int main() {
scanf("%d",&T);
while(T--) {
clear();
scanf("%d",&n);
for(int i=1;i<=n;++i) {
scanf("%s",s);
if(flag)continue;
if(ins(s))flag=true;
}
puts(flag?"NO":"YES");
}
return 0;
}
路漫漫其修远兮,吾将上下而求索