http://acm.hdu.edu.cn/showproblem.php?pid=1671
判断是否出现一个字符串的前缀
Problem Description Given a list of phone numbers, determine if it is consistent in the sense that no number is the prefix of another. Let’s say the phone catalogue listed these numbers:
Input The first line of input gives a single integer, 1 <= t <= 40, the number of test cases. Each test case starts with n, the number of phone numbers, on a separate line, 1 <= n <= 10000. Then follows n lines with one unique phone number on each line. A phone number is a sequence of at most ten digits.
Output For each test case, output “YES” if the list is consistent, or “NO” otherwise.
Sample Input 2 3 911 97625999 91125426 5 113 12340 123440 12345 98346
Sample Output NO YES
Source 2008 “Insigma International Cup” Zhejiang Collegiate Programming Contest - Warm Up(3)
Recommend lcy |
#include<bits/stdc++.h>
using namespace std;
#define MAX 10
struct node
{
int key;
node *next[MAX];
node()
{
key=0;
for(int i=0; i<MAX; i++)
next[i]=null;
}
};
node *root;
void tireInsert(char *str)
{
node*p=root,*q;
for(int i=0; str[i]; i++)
{
int id=str[i]-'0';
if(!p->next[id])
p->next[id]=new node();//建立新节点;
p=p->next[id];//p更新赋值为下一个节点
}
p->key=1;//把它的个数当做1
}
void dell(node*p)
{
if(p)
{
for(int i=0; i<MAX; i++)
if(p->next[i])
{
dell(p->next[i]);
delete p->next[i];
}
}
}
int tireFind(char *str)
{
node *p=root;
int len=strlen(str);
for(int i=0; str[i]; i++)
{
int id=str[i]-'0';
p=p->next[id];//一个个节点开始找;
if(!p)return 1;//说明不存在前缀;
if(p->key==1&&i<len-1)return 0;//出现前缀,那么return 0;
//i<len-1是保证不是他本身;
}
return 1;//无前缀则返回1;
}
int main()
{
int N,T,i;
char str[10005][11];
scanf("%d",&T);
while(T--)
{
scanf("%d",&N);
root=new node();//建立根节点;
for(i=0; i<N; i++)
{
scanf("%s",str[i]);
tireInsert(str[i]);//插入各个字符串;
}
for(i=0; i<N; i++)
if(!tireFind(str[i]))
break;
printf(i<N?"NO\n":"YES\n");
dell(root);//及时释放内存否则会超内存
}
}