HDU 1671 & POJ 3630 Phone List

题意

判断一组字符串中是否出现自己的前缀子串

思路

字典树

#include <stdio.h>
#include
<string.h>
const int MAXN = 100010;
struct dicTree
{
int next[10];
bool isWord;
void init(){
memset(next,
-1,sizeof(next));
isWord
= false;
}
};
dicTree tree[MAXN];
int num;
bool ok;

void insert(char *s){
int index = 0 ,level = 1;
while( *s ){
int i = *s - '0';
if( tree[index].next[i] == -1){
tree[
++num].init();
tree[index].next[i]
= num;
index
= num;
}
else {
index
= tree[index].next[i];
if( tree[index].isWord == true ){ //判断长度小于等于当前插入单词的结尾
ok = false;
return;
}

}

s
++;
}
tree[index].isWord
= true;
for(int i = 0; i < 10; i++){ //判断单词长度大于当前插入单词的是否已经插入过
if( tree[index].next[i] != -1 ){
ok
= false;
break;
}
}
}
int main(){
int t,n;
char telNum[11];
scanf(
"%d",&t);
while( t-- ){
scanf(
"%d",&n);
ok
= true;
num
= 0;
tree[
0].init();
while( n-- ){
if( ok ){
scanf(
"%s",telNum);
insert(telNum);
}
else {//已经知道答案了 后面的数据可以忽略了
scanf(
"%s",telNum);
}
}
if( ok )
printf(
"YES\n");
else
printf(
"NO\n");
}
return 0;
}

posted @ 2011-04-19 16:14  L..  阅读(239)  评论(0编辑  收藏  举报