题意:在给出的所有电话号码中,判断是否有一个电话号码以另一个电话号码为前缀,有的话输出YES,否则输出NO.
分析:在把电话号码插入到字典树的过程中,判断当前电话是否有以前面的电话为前缀或者当前电话作为前面出现字母的前缀.我之前写的时候忽略了以当前字母为前缀的情况,结果wa了两发...
参考代码:
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
const int maxn = 1e4+5;
int n;
char tel[15];
//TrieTree
int child[1000000][10];
bool exist[1000000];
int node;
int flag;
void init()
{
mem(child[0],0);
node = 1;
mem(exist,false);
}
void TrieInsert( char tel[])
{
int rt = 0;
int p = 0;
while( tel[p] != '\0')
{
int id = tel[p]-'0';
if( (tel[p+1] == '\0' && child[rt][id]) || exist[rt])//两种判断
{
flag = 1;
return;
}
if( !child[rt][id])
{
mem(child[node],0);
child[rt][id] = node++;
}
rt = child[rt][id];
p++;
}
exist[rt] = true;
}
int main()
{
int T;
scanf("%d",&T);
while( T--)
{
init();
scanf("%d",&n);
flag = 0;
for( int i = 1; i <= n; i++)
{
scanf("%s",tel);
if( !flag)
TrieInsert(tel);
}
if( flag)
puts("NO");
else
puts("YES");
}
return 0;
}