ZOJ 2876 Phone List(trie树)

来源:互联网 发布:globalprotect mac 编辑:程序博客网 时间:2024/05/16 08:57

判断是否某个电话是另一个电话的前缀.

典型的trie树应用.

#include <iostream>#include <cstdio>#include <memory.h>using namespace std;const int maxn = 10001;struct node{bool flag;node * chd[10];}trie[maxn * 6], *root;int n, cnt;char buf[30];void init(){memset(trie, 0, sizeof(trie));cnt = 0;root = &trie[cnt++];}bool addWord(){int len = strlen(buf), f = 0;node * p = root;for (int i = 0; i < len; ++i){if(p->chd[buf[i] - '0'] == NULL){p->chd[buf[i] - '0'] = &trie[cnt++];p = p ->chd[buf[i] - '0'];f = 1;//建立了新结点,至少已经不是别人的前缀了}else{p = p ->chd[buf[i] - '0'];}if(p->flag){ //字符路径上有一个单词是当前单词的前缀return false;}}p->flag = true;if(!f)return false;//说明这个单词没有建过新结点,肯定是其他单词的前缀return true;}int main(){int T;scanf("%d", &T);while (T--){init();scanf("%d", &n);int f = 0;while (n--){scanf("%s", buf);if(!addWord()){f = 1;}}if(f){printf("NO\n");}else{printf("YES\n");}}return 0;}


原创粉丝点击