HDU1247 字典树

  题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1247 ,比较简单的字典树。

  刚学字典树不久,多做题练练手。



解法:

  先输入所有的字符串,建树。然后对所有的字符串进行枚举,将该字符串的前i位与后len-i位分为两个字符串,如果这两个字符串都在树中,则输出该字符串。由于题中给的数据是按照字典序的,所以不用考虑这点。

  这里用到了strncpy()函数——strncpy 是 C语言的库函数之一,来自 C语言标准库,定义于 string.h,char *strncpy(char *dest, char *src, int n),把src所指字符串的前n个字节复制到dest所指的数组中,并返回指向dest的指针。(from 百度百科)

#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <string>
#include <string.h>
#include <algorithm>
using namespace std;
#define LL __int64
const int maxn = 50000 + 5;
const int sigma_size = 26;
struct Trie {
    int ch[maxn][sigma_size];
    bool isEnd[maxn];
    int size;
    void init() {
        size = 1;
        memset(ch[0] , 0 , sizeof(ch[0]));
        memset(isEnd , 0 , sizeof(isEnd));
    }
    int index(char c) {    return c - ‘a‘;    }
    void insert(char *s) {
        int i , rt;
        for(i = rt = 0 ; s[i] != ‘\0‘ ; i++) {
            int c = index(s[i]);
            if(!ch[rt][c]) {
                memset(ch[size] , 0 , sizeof(ch[size]));
                ch[rt][c] = size++;
            }
            rt = ch[rt][c];
        }
        isEnd[rt] = 1;
    }
    bool find(char *s) {
        int i , rt;
        for(i = rt = 0 ; s[i] != ‘\0‘ ; i++) {
            int c = index(s[i]);
            if(!ch[rt][c])
                return false;
            rt = ch[rt][c];
        }
        return isEnd[rt];
    }
} trie;
char s[maxn][50];
char str[50];
int main()
{
    int n;
    trie.init();
    for(n = 0 ; scanf("%s" , s[n]) != EOF ; n++) {
        trie.insert(s[n]);
    }
    for(int i = 0 ; i <= n ; i++) {
        int len = strlen(s[i]);
        for(int j = 1 ; j < len ; j++) {
            memset(str , 0 , sizeof(str));
            strncpy(str , s[i] , j);
            if(trie.find(str) && trie.find(s[i] + j)) {
                printf("%s\n" , s[i]);
                break;
            }
        }
    }
    return 0;
}
时间: 2024-10-12 10:59:21

HDU1247 字典树的相关文章

hdu1247-Hat’s Words-(字典树)

http://acm.hdu.edu.cn/showproblem.php?pid=1247 题意:给出一堆单词,求哪些单词是其中某两个单词拼接起来的. 题解:用字典树存储所有的单词,标记结束点,再次遍历单词的时候如果遍历过程遇到结束点则表明有单词是该单词的前缀,查找后半段字母(后缀)看看最后能不能遇到结束点,如果遇到了则该单词是某两个单词的前后缀,可以输出.详看注释. #include<stdio.h> #include<iostream> #include<algorit

hdu1247 Hat’s Words 字典树

Problem Description A hat's word is a word in the dictionary that is the concatenation of exactly two other words in the dictionary. You are to find all the hat's words in a dictionary. Input Standard input consists of a number of lowercase words, on

HDU1247 Hat’s Words【字典树】

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1247 题目大意: 一个"hat's word"是一个单词,可以恰好由字典中其他两个单词连接得到(比如字典中是hat's和word). 给出字典中的单词,输出所有的hat's word. 思路: 建立字典树,将每个单词都插入到Trie树中,Count统计单词(不是前缀)出现次数.按顺序将每个单词 所有可能的长度拆分成前缀单词和后缀单词,判断这两部分是否都在字典树中,是就是hat's wor

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