山東省第1回ACM大学生プログラム設計コンテストPhone Number辞書ツリー
Phone Number
Time Limit:1000 ms Memory limit:65536 K質問は?ここをクリック^^;
タイトルの説明
We know that if a phone number A is another phone number B’s prefix, B is not able to be called. For an example, A is 123 while B is 12345, after pressing 123, we call A, and not able to call B. Given N phone numbers, your task is to find whether there exits two numbers A and B that A is B’s prefix.
入力
The input consists of several test cases. The first line of input in each test case contains one integer N (0しゅつりょく
For each test case, if there exits a phone number that cannot be called, print “NO”, otherwise print “YES” instead.
サンプル入力
サンプル出力
ヒント
ソース
2010年山東省第1回ACM大学生プログラム設計コンテスト
水問題辞書ツリーは、接頭辞番号が表示されているかどうかを判断します.
ACcode:
Time Limit:1000 ms Memory limit:65536 K質問は?ここをクリック^^;
タイトルの説明
We know that if a phone number A is another phone number B’s prefix, B is not able to be called. For an example, A is 123 while B is 12345, after pressing 123, we call A, and not able to call B. Given N phone numbers, your task is to find whether there exits two numbers A and B that A is B’s prefix.
入力
The input consists of several test cases. The first line of input in each test case contains one integer N (0
For each test case, if there exits a phone number that cannot be called, print “NO”, otherwise print “YES” instead.
サンプル入力
2
012
012345
2
12
012345
0
サンプル出力
NO
YES
ヒント
ソース
2010年山東省第1回ACM大学生プログラム設計コンテスト
水問題辞書ツリーは、接頭辞番号が表示されているかどうかを判断します.
ACcode:
#include <map>
#include <queue>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#define MAX 10
#define maxn 1005
using namespace std;
struct Trie{
Trie* next[MAX];
int v;
};
struct STR{
char str[maxn];
int len;
bool operator<(const STR &a)const{
return (this->len<a.len);
}
}my[maxn];
Trie *root;
int n,ans,num;
void createTire(char *str){
int len=strlen(str);
Trie *p=root,*q;
for(int i=0;i<len;++i){
int id=str[i]-'0';
if(p->next[id]==NULL){
q=(Trie *)malloc(sizeof(Trie));
q->v=1;
for(int j=0;j<MAX;++j)
q->next[j]=NULL;
p->next[id]=q;
p=p->next[id];
}
else{
p->next[id]->v++;
p=p->next[id];
}
}
p->v=-1;
}
int findTrie(char *str){
int len=strlen(str);
Trie *p=root;
for(int i=0;i<len;++i){
int id=str[i]-'0';
p=p->next[id];
if(p==NULL)
return 0;
if(p->v==-1)
return 0;
}
return 2;
}
void init(){
root=(Trie *)malloc(sizeof(Trie));
for(int i=0;i<MAX;++i)
root->next[i]=NULL;
ans=num=0;
memset(my,0,sizeof(my));
}
int main(){
while(~scanf("%d",&n)&&n){
init();
for(int i=0;i<n;++i){
scanf("%s",my[i].str);
my[i].len=strlen(my[i].str);
}
sort(my,my+n);
for(int i=0;i<n;++i)createTire(my[i].str);
// for(int i=0;i<n;i++)cout<<my[i].str<<'\12';
for(int i=0;i<n;++i)
ans+=findTrie(my[i].str);
//cout<<"ans: "<<ans<<'\12';
for(int i=0;i<n&&!ans;++i)
for(int j=i+1;j<n;++j)
if(!strcmp(my[i].str,my[j].str))
ans++;
printf(ans>0?"NO
":"YES
");
}
return 0;
}
/*
2
012
012345
2
12
012345
0
*/