NYOJ 163 Phone List

来源:互联网 发布:网络咨询师工作流程 编辑:程序博客网 时间:2024/05/18 00:06

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=163

如:给出三组phone numbers,

  • Emergency 911
  • Alice 97 625 999
  • Bob 91 12 54 26

    判断较短的phone number是否是这组numbers中的一条或多条的前缀。也是判断一组字符串中,是否存在某一字符串是其它字符串的前缀。这里较为简便的方法是采用"字典树"(Trie)了,那何为"字典树“呢?

     关于字典树的详细讲解在http://blog.csdn.net/cyongxue/article/details/19603401中可以看到。

    理解了字典树,这里可以直接写出代码了:

    int Insert(char *str){bool flag = false;int length = strlen(str);Trie *p = root;for(int i = 0;i<length;i++){int id = str[i] - '0';p = p->next[id];if(p == NULL){flag = true;//说明str不在当前的字典树中,那么可将其加入其中Trie *q = new 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->v++;p = p->next[id];}}p->v--;return flag;}//phone listint _tmain(int argc, _TCHAR* argv[]){root = new Trie;root->v = 1;for(int i = 0;i<MAX;i++)root->next[i] = NULL;int times = 0;cin>>times;char str[20];while(times--){int nums = 0;cin>>nums;for(int i = 0;i<nums;i++ ){cin>>str;if(Insert(str))cout<<"YES"<<endl;elsecout<<"NO"<<endl;}}return 0;}


    

  • 0 0
    原创粉丝点击