hdu2072 字典树

这题印象深刻,我刚接触acm时,以为这题是水题(因为是中文,又短),一直没做出。现再想想也是。可能也是我以前字符串掌握不好;

这题其实也可以用stl里的map写。这里我用字典树写的。其实这题算简单题了吧。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct trie
{
    trie *next[26];
    int flag;//flag标记这里是否一个单词结束,也就是说到这里是否有一个单词;
};
trie *root;
void init()
{
    int i;
    root=(trie*)malloc(sizeof(trie));
    for(i=0;i<26;i++)
    {
        root->next[i]=NULL;
    }
    root->flag=0;
}
void insert(char *str)
{
    trie *p=root,*q;
    int i,j,len=strlen(str);
    for(i=0;i<len;i++)
    {
        int id=str[i]-‘a‘;
        if(p->next[id]==NULL)
        {
            q=(trie*)malloc(sizeof(trie));
            for(j=0;j<26;j++)
                q->next[j]=NULL;
            q->flag=0;
            p->next[id]=q;
        }
        p=p->next[id];
        if(i==len-1)
            p->flag=1;
    }
}
int query(char *str)
{
    int i,len=strlen(str);
    trie *p=root;
    for(i=0;i<len;i++)
    {
        int id=str[i]-‘a‘;
        if(p->next[id]==NULL)
            return 1;
        else
        {
            p=p->next[id];
        }
    }
    if(p->flag==1)
        return 0;
     return 1;
}
int main()
{
    int i,j,ans;
    char str[1000],s[100];
    while(gets(str))
    {
        ans=0;
        init();
        if(str[0]==‘#‘)break;
        int len=strlen(str);
        int num;
        for(i=0;i<len;i++)
        {
            num=0;
            for(j=i;j<len;j++)
            {
                if(str[j]==‘ ‘)
                    break;
                s[num++]=str[j];//读取单词
            }
            i=j;
            s[num]=‘\0‘;
            //printf("%s ",s);
            if(strcmp(s,"")!=0&&query(s))//前面strcmp主要为了防止空格
            {
                insert(s);
                ans++;
            }
        }
        printf("%d\n",ans);
    }
}
时间: 2024-11-13 10:19:03

hdu2072 字典树的相关文章

hdu2072 单词数 字典树

字典树裸题 1 #include<stdio.h> 2 #include<string.h> 3 int next[5000][26]; 4 bool is_e[5000]; 5 int cnt; 6 int ans; 7 8 void Insert(char *word,int s1){ 9 int root=0; 10 for(int i=0;i<s1;i++){ 11 if(next[root][word[i]-'a']<0){ 12 next[root][wor

hdu-2072(字典树)

字典树模板题 代码 #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; int tot=1; int root; int trie[100500][30]; int flagg[100500]; int visit[100500]; char s[100500]; char t[10050]; int cnt; void

Tire树(字典树)

from:https://www.cnblogs.com/justinh/p/7716421.html Trie,又经常叫前缀树,字典树等等.它有很多变种,如后缀树,Radix Tree/Trie,PATRICIA tree,以及bitwise版本的crit-bit tree.当然很多名字的意义其实有交叉. 定义 在计算机科学中,trie,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串.与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定.一个节点的所有

hdu 1251 统计难题(字典树)

Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). Input 输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串. 注意:本题只有一组测试数据,处理到文件结束. Output 对于每个提

51nod round3# 序列分解(折半枚举+字典树)

小刀和大刀是双胞胎兄弟.今天他们玩一个有意思的游戏. 大刀给小刀准备了一个长度为n的整数序列.小刀试着把这个序列分解成两个长度为n/2的子序列. 这两个子序列必须满足以下两个条件: 1.他们不能相互重叠. 2.他们要完全一样. 如果小刀可以分解成功,大刀会给小刀一些糖果. 然而这个问题对于小刀来说太难了.他想请你来帮忙. Input 第一行给出一个T,表示T组数据.(1<=T<=5) 接下来每一组数据,输入共2行. 第一行包含一个整数n (2<=n<=40且为偶数). 第二行给出n

白话算法与数据结构之【字典树】

1. 什么是trie树 1.Trie树 (特例结构树) Trie树,又称单词查找树.字典树,是一种树形结构,是一种哈希树的变种,是一种用于快速检索的多叉树结构.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高.      Trie的核心思想是空间换时间.利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的. Trie树也有它的缺点,Trie树的内存消耗非常大.当然,或许用左儿子

[算法系列之二十]字典树(Trie)

一 概述 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计. 二 优点 利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希表高. 三 性质 (1)根节点不包含字符,除根节点外每一个节点都只包含一个字符: (2)从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串: (3)每个节点的所有子节点包含的字符都不相同. 单词列表为"apps&

poj 3764 The xor-longest Path(字典树)

题目链接:poj 3764 The xor-longest Path 题目大意:给定一棵树,每条边上有一个权值,找出一条路径,使得路径上权值的亦或和最大. 解题思路:dfs一遍,预处理出每个节点到根节点路径的亦或和rec,那么任意路径均可以表示rec[a] ^ rec[b],所以问题 就转换成在一些数中选出两个数亦或和最大,那么就建立字典树查询即可. #include <cstdio> #include <cstring> #include <algorithm> us

字典树

字典树(Trie)是一种很特别的树状信息检索数据结构,如同其名,它的构成就像一本字典,可以让你快速的进行字符插入.字符串搜索等. Trie 一词来自 retrieval,发音为 /tri:/ "tree",也有人读为 /tra?/ "try". 字典树设计的核心思想是空间换时间,所以数据结构本身比较消耗空间.但它利用了字符串的共同前缀(Common Prefix)作为存储依据,以此来节省存储空间,并加速搜索时间.Trie 的字符串搜索时间复杂度为 O(m),m 为最