Loading

SP4033 PHONELST - Phone List

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;
}
posted @ 2020-03-04 21:35  zzctommy  阅读(133)  评论(0编辑  收藏  举报