字典树 插入 排序 分配id

字典树分配id最常见,其他一半很少用,也可能渣做的题比较少

贴代码,代码有解释:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
using namespace std;
int cnt;
struct  node
{
    int id;
    int prefix;//记录前缀个数
    node *next[26];//指向字典树下一层,如果全是小写字母是26这视情乱而定
    node(){
        for(int i=0;i<26;i++)
        next[i]=NULL;
        id =0;
        prefix=0;
    }//初始化
}*root;

int  Insert(char *s){
    int len =strlen (s);
    node *p= root;
    for(int i=0;i<len;i++){
        int k=s[i]-'a';
        if(p->next[k]==NULL){
            p->next[k]=new node();
        }
        p=p->next[k];
        p->prefix++;
    }
    if(p->id==0)
    return p->id=++cnt;
    return p->id;
}//插入并分配id

int  find(char s[]){
    int len =strlen(s);
    node *p =root;
    for(int i=0;i<len;i++){
        p=p->next[s[i]-'a'];
    }
    return p->prefix;
}//查找此前缀是多少人的前缀

int x;//记录总共有多少字符串参与了排序
int all[200];//记录排好序的id

void output(node *p){
      if(p!=NULL){
           if(p->id!=0){
                all[x++]=p->id;
            }
        for(int i=0;i<26;i++){

            if(p->next[i]){
            output(p->next[i]);
            }
        }
      }
}//字符串排序
int main(){
    cnt =0;
    root =new node();
    char s[100][100];
    char s2[100][100];
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%s",s[i]);
        printf("%d\n",Insert(s[i]));
        strcpy(s2[Insert(s[i])],s[i]);
    }
    for(int i=0;i<n;i++){
        printf("%d\n",find(s[i]));
    }
    /*排序后*/
    x=0;
    output(root);
    printf("%d\n",x);
    for(int i=0;i<x;i++){
        printf("%d %s\n",all[i],s2[all[i]]);
    }

}
时间: 2024-12-12 06:41:10

字典树 插入 排序 分配id的相关文章

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

[转载]Trie树|字典树(字符串排序)

有时,我们会碰到对字符串的排序,若采用一些经典的排序算法,则时间复杂度一般为O(n*lgn),但若采用Trie树,则时间复杂度仅为O(n). Trie树又名字典树,从字面意思即可理解,这种树的结构像英文字典一样,相邻的单词一般前缀相同,之所以时间复杂度低,是因为其采用了以空间换取时间的策略. 下图为一个针对字符串排序的Trie树(我们假设在这里字符串都是小写字母),每个结点有26个分支,每个分支代表一个字母,结点存放的是从root节点到达此结点的路经上的字符组成的字符串. 将每个字符串插入到tr

HDU 5687 字典树插入查找删除

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5687 2016百度之星资格赛C题,直接套用字典树,顺便巩固了一下自己对字典树的理解 1 #include<stdio.h> 2 #include<string.h> 3 struct node{ 4 int next[27]; 5 int cnt; 6 void init(){ 7 cnt = 0;//计数 8 memset(next,-1,sizeof(next)); 9 } 10 };

字典树 一种快速插入查询数据结构

定义 字典树,又称单词查找树,Trie树,是一种树形结构,典型应用是用于统计,排序和保存大量的字符串,所以经常被搜索引擎系统用于文本词频统计.它的优点是:利用字符串的公共前缀来节约存储空间,最大限度的减少无谓的字符串比较,查询效率比哈希表高. 解释 这个图片比较经典 就是在每一次边存的是字符,点标记着个点是否之前的边的字符都存在 如图存在的字符串有 abc abcd abd.... 代码 #include <cstdio> #include <cstring> #include &

跳跃表,字典树(单词查找树,Trie树),后缀树,KMP算法,AC 自动机相关算法原理详细汇总

第一部分:跳跃表 本文将总结一种数据结构:跳跃表.前半部分跳跃表性质和操作的介绍直接摘自<让算法的效率跳起来--浅谈"跳跃表"的相关操作及其应用>上海市华东师范大学第二附属中学 魏冉.之后将附上跳跃表的源代码,以及本人对其的了解.难免有错误之处,希望指正,共同进步.谢谢. 跳跃表(Skip List)是1987年才诞生的一种崭新的数据结构,它在进行查找.插入.删除等操作时的期望时间复杂度均为O(logn),有着近乎替代平衡树的本领.而且最重要的一点,就是它的编程复杂度较同类

Trie(字典树)解析及其在编程竞赛中的典型应用举例

摘要: 本文主要讲解了Trie的基本思想和原理,实现了几种常见的Trie构造方法,着重讲解Trie在编程竞赛中的一些典型应用. 什么是Trie? 如何构建一个Trie? Trie在编程竞赛中的典型应用有些? 例题解析 什么是Trie? 术语取自retrieval中(检索,收回,挽回)的trie,读作"try",也叫做前缀树或者字典树,是一种有序的树形数据结构.我们常用字典树来保存字符串集合(但不仅限于字符串),如下图就是一个字典树. 它保存的字符集合是{to,te,tea,ted,te

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

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

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

Phone List HDU - 1671 字典树

题意:给出一堆一组一组的数字  判断有没有哪一个是另外一个的前缀 思路:字典树 插入的同时进行判断  不过 当处理一组数字的时候 需要考虑的有两点1.是否包含了其他的序列2.是否被其他序列包含 刚开始开的1e4死活不过  1e5直接过了.. 1 #include<bits/stdc++.h> 2 #include<string> 3 using namespace std; 4 const int maxn=1e5+5; 5 struct Trie{ 6 int size; 7 i