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

相关文章

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

HDUPlay on Words

1.定理:无向图G有欧拉通路的充分必要条件是G为连通图,并且G仅有两个奇度结点或者无奇度结点。 (1)当G是仅有两个奇度结点的连通图时,G的欧拉通路必以此两个结点为端点。 (2)当G是无奇度结点的连通图时,G必有欧拉回路。 2.一个有向图D具有欧拉通路,当且仅当D是连通的,且除了两个顶点外,其余顶点的入度均等于出度,这两个特殊的顶点中,一个顶点的入度比出度大1,另一个顶点的入度比出度小1

POJ2001字典树

给出n个单词,求出每个单词的非公共前缀,如果没有,则输出自己。 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.io.UnsupportedEncodingException;

Collection List Set Map的区别和联系

Collection List Set Map的区别和联系 这些都代表了Java中的集合,这里主要从其元素是否有序,是否可重复来进行区别记忆,以便恰当地使用,当然还存在同步方面的差异,见上一篇相关文章。 有序否 允许元素重复否 Collection 否 是 List 是 是 Set AbstractSet 否

cell phone teardown 手机拆卸

tweezer 镊子 screwdriver 螺丝刀 opening tool 开口工具 repair 修理 battery 电池 rear panel 后盖 front and rear cameras 前后摄像头 volume button board 音量键线路板 headphone jack 耳机孔 a cracked screen 破裂屏 otherwise non-functiona

【Python报错已解决】AttributeError: ‘list‘ object has no attribute ‘text‘

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一:检查属性名2.2 步骤二:访问列表元素的属性 三、其他解决方法四、总结 前言 在Python编程中,属性错误(At

List list = new ArrayList();和ArrayList list=new ArrayList();的区别?

List是一个接口,而ArrayList 是一个类。 ArrayList 继承并实现了List。 List list = new ArrayList();这句创建了一个ArrayList的对象后把上溯到了List。此时它是一个List对象了,有些ArrayList有但是List没有的属性和方法,它就不能再用了。而ArrayList list=new ArrayList();创建一对象则保留了A

MiniCPM-V: A GPT-4V Level MLLM on Your Phone

MiniCPM-V: A GPT-4V Level MLLM on Your Phone 研究背景和动机 现有的MLLM通常需要大量的参数和计算资源,限制了其在实际应用中的范围。大部分MLLM需要部署在高性能云服务器上,这种高成本和高能耗的特点,阻碍了其在移动设备、离线和隐私保护场景中的应用。 文章主要贡献: 提出了MiniCPM-V系列模型,能在移动端设备上部署的MLLM。 性能优越:

python 实现第k个字典排列算法

第k个字典排列算法介绍 "第k个字典排列"算法通常指的是在给定的字符集合(例如,字符串中的字符)中,找到所有可能排列的第k个排列。这个问题可以通过多种方法解决,但一个常见且高效的方法是使用“下一个排列”算法的变种,或称为“第k个排列”的直接算法。 方法一:使用“下一个排列”的变种 生成所有排列:首先生成所有排列,但显然这种方法对于较大的输入集合是不切实际的,因为它涉及到大量的计算和存储。 排序