hdu1251 简单字典树

之前去省赛打酱油,遇到一题二进制相关的题目,当时都没做出。后来几个学长找规律打表,然后做;老族长说要用到字典树思想。

也应该学习学习字典树。随手拿水题,看题解,看代码,还是懂了字典树;

内存消耗真的大。。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define maxn 26//26个字母
 struct trie
{
    trie *next[maxn];//向下26个字母扩展
    int v;//记录个数
};
trie *root;
void init()
{
    root=(trie*)malloc(sizeof(trie));
    for(int i=0;i<maxn;i++)
        root->next[i]=NULL;
    root->v=0;
}
void creattrie(char *str)
{
    trie *p,*q;
    p=root;
    int i,j;
    int len=strlen(str);
    for(i=0;i<len;i++)
    {
        int id=str[i]-‘a‘;
        if(p->next[id]==NULL)
        {
            q = (trie *)malloc(sizeof(trie));
            q->v=0;
            for(j=0;j<maxn;j++)
                q->next[j]=NULL;
            p->next[id]=q;
        }
        p=p->next[id];
        p->v++;//次数增加
    }
}
int query(char *str)
{
    int i,j;
    int len=strlen(str);
    trie *p=root;
    for(i=0;i<len;i++)
    {
        int id=str[i]-‘a‘;
        if(p->next[id]==NULL)
            return 0;
        p=p->next[id];
    }
    return p->v;
}
int main()
{
    char str[15];
    int i,j;
    init();
    while(gets(str))
    {
        if(strcmp(str,"")==0)break;
        creattrie(str);
    }
    while(gets(str))
    {
        if(strcmp(str,"")==0)break;
        printf("%d\n",query(str));
    }
}
时间: 2024-10-14 04:48:26

hdu1251 简单字典树的相关文章

HDU 1247 简单字典树

Hat’s Words Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7359    Accepted Submission(s): 2661 Problem Description A hat’s word is a word in the dictionary that is the concatenation of exactly

HDU1251 裸字典树

HDU1251:http://acm.hdu.edu.cn/showproblem.php?pid=1251 初学字典树,码模板-- #include<iostream> #include<string.h> using namespace std; char a[15]; struct node { node *nextt[26]; int v=0; }; node root; void init() { for (int i = 0; i < 26; i++) { roo

统计难题(简单字典树)

字典树(讲解+模板) 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高. 字典树跟字典很相似,当我们要查询一个单词是不是在字典中时,我们首先查询单词的第一个字母,之后确定了一个字母后,查找下一个字母,反复这种操作,直到找到单词,但是这种效率很低,在庞大的单词系统面前,则显得心塞了.

HDU4825/5536 [01 字典树/简单字典树更新]

Xor Sum Time Limit: 1000 MS Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometheus 将向 Zeus 发起M次询问,每次询问中包含一个正整数 S ,之后 Zeus 需要在集合当中找出一个正整数 K ,使得 K 与 S 的异或结果最大.Prometheus 为了让 Zeus 看到人类的伟大,随即同意 Zeus 可以向人类求助.你能证明人类的智慧么? Input 输入包含若干组测试数

hdu-1251(字典树)

字典树模板题. ps:数组要开大,40w左右才行,不然疯狂re 代码: #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; int root; int tot=1; int trie[400500][30]; int cnt[400500]; void init()//最后清空,节省时间 { memset(trie,0,s

hdu1305 简单字典树

这题我开始想的简单了,WA一次,然后看disscuss里有人说输入时长度从小到大的,然后我信了.然后开始while(1) WA;然后我尝试先放如数组.后来对了: discuss里面果然不能太相信. 根据出现的次数来判断是否为前缀. #include<stdio.h> #include<string.h> #include<stdlib.h> struct trie { trie *next[2]; int sum; }; trie *root; void creattr

HDU1251(字典树)

#include"cstdio" #include"cstring" using namespace std; const int N=26; struct node{ int t; node* next[N]; node() { t=0; for(int i=0;i<N;i++) next[i]=NULL; } }; node* root; void insert(char *s) { node* p=root; for(int i=0;s[i];i++)

hdu1251 字典树or map

一道字典树的题,不过看起来用map更为简单 传送门 题意: 给出一堆字符串构成一个字典,求字典里以某字符串为前缀的字符串有几个 思路: 输入字符串时把字符串的前缀全部存进map并标记次数 查询时直接输出就可以了 AC代码: 1 #include "stdio.h" 2 #include "map" 3 #include "string" 4 #include "string.h" 5 #include "iostre

Phone List(简单的字典树插入操作)

Phone List Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 11655    Accepted Submission(s): 3970 Problem Description Given a list of phone numbers, determine if it is consistent in the sense th