题意给N个电话号码,检测是否存在一个电话号码是另外一个电话号码的前缀,存在输出NO否则输出YES。
trie树的模板题,正好拿来试试模板。只要在每次insert的时候检测一下经过的路径存不存在单词节点就行。另外在插入完成时也要判断一下当前的单词节点在不在其他单词的路径上。
#include <iostream>
#include <cstdio>
#include <memory.h>
#include <string>
#include <cstring>
using namespace std;
const int tk=11,tb='0';
int top,tree[200000][tk+1];
void init()
{
top=1;
memset(tree,0,sizeof tree);
}
int search(char *s)
{
for (int rt=0; rt=tree[rt][*s-tb];)
{
if (*(++s)==0) return tree[rt][tk];
}
return 0;
}
bool insert(char *s,int rank=1)
{
int rt,nxt;
for (rt=0; *s; rt=nxt,++s)
{
nxt=tree[rt][*s-tb];
if (tree[rt][tk]) return false;
if (0==nxt)
{
tree[rt][*s-tb]=nxt=top;
memset(tree[top],0,sizeof tree[top]);
top++;
}
}
tree[rt][tk]=rank;
for (int i=0; i<=9; i++)
if (tree[rt][i]!=0) return false;
return true;
}
void del(char* s)
{
int rt=0;
for ( ; *s; ++s)
rt=tree[rt][*s-tb];
tree[rt][tk]=0;
}
int prefix (char *s)
{
int rt=0,lv;
for (lv=0; *s; ++s,++lv)
{
rt=tree[rt][*s-tb];
if (rt==0) break;
}
return lv;
}
int tt;
int n;
int main()
{
//freopen("a.in","r",stdin);
scanf("%d",&tt);
char str[20];
while (tt--)
{
bool flag=true;
init();
scanf("%d",&n);
for (int i=1; i<=n; i++)
{
scanf("%s",str);
//if (!flag) continue;
if (!insert(str))
{
flag=false;
}
}
if (flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}