ACM 字典树 Phone List Hat’s Words

2024-03-29 13:32
文章标签 list 字典 words acm hat phone

本文主要是介绍ACM 字典树 Phone List Hat’s Words,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

字典树:又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。

典型应用:统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。

优点:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。

基本性质:

1.根节点不包含字符,除根节点外每一个节点都只包含一个字符。
2.从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。
3.每个节点的所有子节点包含的字符都不相同。

基本模板:(来自百度百科)

 

#define MAX 26//字符集大小
typedef struct TrieNode
{int nCount;//记录该字符出现次数struct TrieNode* next[MAX];
}TrieNode;TrieNode Memory[1000000];
int allocp=0;/*初始化*/
void InitTrieRoot(TrieNode* *pRoot)
{*pRoot=NULL;
}/*创建新结点*/
TrieNode* CreateTrieNode()
{int i;TrieNode *p;p=&Memory[allocp++];p->nCount=1;for(i=0;i<MAX;i++){p->next[i]=NULL;}return p;
}/*插入*/
void InsertTrie(TrieNode* *pRoot,char *s)
{int i,k;TrieNode*p;if(!(p=*pRoot)){p=*pRoot=CreateTrieNode();}i=0;while(s[i]){k=s[i++]-'a';//确定branchif(!p->next[k])p->next[k]=CreateTrieNode();elsep->next[k]->nCount++;p=p->next[k];}
}//查找
int SearchTrie(TrieNode* *pRoot,char *s)
{TrieNode *p;int i,k;if(!(p=*pRoot)){return0;}i=0;while(s[i]){k=s[i++]-'a';if(p->next[k]==NULL) return 0;p=p->next[k];}return p->nCount;
}

 

 

 

HDU 1671 Phone List

题目大意:(例题带入)有2组数据,第一组数据有3个电话号码,问是否存在一个号码是另一个的前缀,若存在则不合适,输出NO。

思路:字典树,在建树的时候直接判断了...

 

#include <iostream>
#define MAX 10
using namespace std;
bool flag;
typedef struct Trie_Node
{bool isphone;struct Trie_Node *next[MAX];    
}Trie;
void insert(Trie *root,char *phone)
{Trie *p=root;while(*phone!='\0'){if(p->next[*phone-48]==NULL){Trie *temp=(Trie *)malloc(sizeof(Trie));temp->isphone=false;for(int i=0;i<MAX;i++)temp->next[i]=NULL;p->next[*phone-48]=temp;    }if(p->isphone==true)flag=true;p=p->next[*phone-48];phone++;}p->isphone=true;for(int i=0;i<MAX;i++){if(p->next[i]!=NULL){flag=true;break;}}    
}
void del(Trie *root)
{for(int i=0;i<MAX;i++){if(root->next[i]!=NULL)del(root->next[i]);}free(root);
}
int main(int argc, char *argv[])
{int t;scanf("%d",&t);while(t--){int i;int n;char phone[11];Trie *root=(Trie *)malloc(sizeof(Trie));root->isphone=false;flag=false;for(i=0;i<MAX;i++)root->next[i]=NULL;scanf("%d",&n);for(i=0;i<n;i++){scanf("%s",phone);if(flag!=true)insert(root,phone);}if(flag==true)printf("NO\n");elseprintf("YES\n");del(root);               }return 0;
}


HDU 1247 Hat’s Words

 

题目大意:输入直到EOF结束,判断是否存在两个组合可以组成另一个字符串。

思路:先把所有字符串都存下来建树,然后从根走到每个叶子结点记下来比较。

 

#include<iostream>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<algorithm>
using namespace std;
const int MAX=26;
typedef struct Trie_Node
{bool isWord;struct Trie_Node *next[MAX];
}Trie;
char s[50010][50];
void insert(Trie *root,char *word)
{Trie *p=root;int i=0;while(word[i]!='\0'){if(p->next[word[i]-'a']==NULL){Trie *temp=(Trie *)malloc(sizeof(Trie));for(int j=0;j<MAX;j++)temp->next[j]=NULL;temp->isWord=false;p->next[word[i]-'a']=temp;}p=p->next[word[i]-'a'];i++;}p->isWord=true;
}
bool search(Trie *root,char *word)
{Trie *p=root;for(int i=0;word[i]!='\0';i++){if(p->next[word[i]-'a']==NULL)return false;p=p->next[word[i]-'a'];}return p->isWord;
}
void del(Trie *root)
{for(int i=0;i<MAX;i++){if(root->next[i]!=NULL)del(root->next[i]);}free(root);
}
int main()
{int i,j;int cnt=0;char str[50];Trie *root=(Trie *)malloc(sizeof(Trie));for(i=0;i<MAX;i++)root->next[i]=NULL;root->isWord=false;while(scanf("%s",s[cnt])!=EOF){insert(root,s[cnt++]);}for(i=0;i<cnt;i++){int len=strlen(s[i]);for(j=1;j<len-1;j++){char temp1[50]={'\0'};char temp2[50]={'\0'};strncpy(temp1,s[i],j);strncpy(temp2,s[i]+j,len-j);if(search(root,temp1)&&search(root,temp2)){printf("%s\n",s[i]);break;}}}del(root);return 0;
}

 

 

 

 

 

 

 

这篇关于ACM 字典树 Phone List Hat’s Words的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/858719

相关文章

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

java streamfilter list 过滤的实现

《javastreamfilterlist过滤的实现》JavaStreamAPI中的filter方法是过滤List集合中元素的一个强大工具,可以轻松地根据自定义条件筛选出符合要求的元素,本文就来... 目录1. 创建一个示例List2. 使用Stream的filter方法进行过滤3. 自定义过滤条件1. 定

Python容器类型之列表/字典/元组/集合方式

《Python容器类型之列表/字典/元组/集合方式》:本文主要介绍Python容器类型之列表/字典/元组/集合方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 列表(List) - 有序可变序列1.1 基本特性1.2 核心操作1.3 应用场景2. 字典(D

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

python中列表list切分的实现

《python中列表list切分的实现》列表是Python中最常用的数据结构之一,经常需要对列表进行切分操作,本文主要介绍了python中列表list切分的实现,文中通过示例代码介绍的非常详细,对大家... 目录一、列表切片的基本用法1.1 基本切片操作1.2 切片的负索引1.3 切片的省略二、列表切分的高

java两个List的交集,并集方式

《java两个List的交集,并集方式》文章主要介绍了Java中两个List的交集和并集的处理方法,推荐使用Apache的CollectionUtils工具类,因为它简单且不会改变原有集合,同时,文章... 目录Java两个List的交集,并集方法一方法二方法三总结java两个List的交集,并集方法一

Java集合中的List超详细讲解

《Java集合中的List超详细讲解》本文详细介绍了Java集合框架中的List接口,包括其在集合中的位置、继承体系、常用操作和代码示例,以及不同实现类(如ArrayList、LinkedList和V... 目录一,List的继承体系二,List的常用操作及代码示例1,创建List实例2,增加元素3,访问元

C#比较两个List集合内容是否相同的几种方法

《C#比较两个List集合内容是否相同的几种方法》本文详细介绍了在C#中比较两个List集合内容是否相同的方法,包括非自定义类和自定义类的元素比较,对于非自定义类,可以使用SequenceEqual、... 目录 一、非自定义类的元素比较1. 使用 SequenceEqual 方法(顺序和内容都相等)2.

Java中List转Map的几种具体实现方式和特点

《Java中List转Map的几种具体实现方式和特点》:本文主要介绍几种常用的List转Map的方式,包括使用for循环遍历、Java8StreamAPI、ApacheCommonsCollect... 目录前言1、使用for循环遍历:2、Java8 Stream API:3、Apache Commons

python 字典d[k]中key不存在的解决方案

《python字典d[k]中key不存在的解决方案》本文主要介绍了在Python中处理字典键不存在时获取默认值的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录defaultdict:处理找不到的键的一个选择特殊方法__missing__有时候为了方便起见,