字典树的动态与静态模板

动态链表:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstring>
 
using namespace std;
 
struct Node
{
    Node * child[10];
    bool bad;
    Node()    //构造函数中初始化。在静态分配时就能初始化。
    {
        memset(child, 0, sizeof(child));
        bad = false;
    }
};
int nodeCount;  //用来指向数组中未分配的单元。
bool insertNode(Node *tree, char *s)
{
    int i;
    Node * p = tree;
    for(i = 0; s[i+1]; i++)
    {
        if(p->child[s[i]-‘0‘] == 0)
        {
            p->child[s[i]-‘0‘] = tree + nodeCount; //将各个节点按次序分配到数组的相应位置。
            nodeCount++;
        }
        p = p->child[s[i]-‘0‘];
        if(p->bad)    //如果遇到危险节点(某个字符串的最后一个节点),则说明该串含有前面的串。
        {
            return false;
        }
    }
    bool ok;
    if(p->child[s[i]-‘0‘] == 0)
    {
        p->child[s[i]-‘0‘] = tree + nodeCount;
        nodeCount++;
        ok = true;
    }
    else    //如果最后一个节点已经被分配过,说明该串是前面串的前缀。
        ok = false;
   
    p = p->child[s[i]-‘0‘];
    p->bad = true;  //字符串最后一个节点是危险节点。
    return ok;
}
void del(Node *p)
{
    for(int i=0;i<10;i++)
    {
        if(p->child[i])
            del(p->child[i]);
    }
    delete(p);
}
Node Tree[100000];  //为了避免初始化,直接重新开,分配大小要合适,否则RA。
int main()
{
    int n, i, t;
    bool ok;
    scanf("%d", &t);
    while(t--)
    {
        scanf("%d", &n);
        char s[12];
        memset(Tree,0,sizeof(Tree));
        nodeCount = 1;
        ok = true;
        for(i = 0; i < n; i++)
        {
            scanf(" %s", s);
            if(!insertNode(Tree, s))
            {
                ok = false;
            }
        }
        if(ok)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}

 静态数组模拟模板:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int M = 33333;
const int N = 27;
char st[M][N];
int tot,size,sz;
int trie[M*10][N],num[10*M];
void insert(char *st){
    int len=strlen(st+1);
    int now=0;
    for(int i=1;i<=len;i++){
        int k=st[i]-‘a‘;
        if(trie[now][k]==0) trie[now][k]=++sz;
        now=trie[now][k];
        num[now]++;
    }
}
void ask(char *st){
    int now=0,k,len=strlen(st+1);
    for(int i=1;i<=len;i++){
        if(num[now]==1) break;
        k=st[i]-‘a‘;
        printf("%c",st[i]);
        now=trie[now][k];
    }
}
int main(){
    while(~scanf("%s",st[++tot]+1))
        insert(st[tot]);
    for(int i=1;i<=tot;i++){
        printf("%s ",st[i]+1);
        ask(st[i]);
        printf("\n");
    }
    return 0;
}

  

时间: 2024-11-09 00:50:34

字典树的动态与静态模板的相关文章

静态字典树模板

#include <iostream> #include <cstring> #include <cstdio> using namespace std; int pos; struct node { int child[26]; }tree[10000010]; int add() { pos++; for(int i=0;i<26;i++) { tree[pos].child[i]=-1; } return pos; } int inser(char* str

字典树的建立和基本查找

字典树的建立和基本查找 一.字典树的定义 字典树又叫做前缀树,任意一个或多个字符串可以构建一棵字典树用于存储多个串的公共前缀 二.构建字典树的两种方法 (1)字典树的链表构建及查找 在用链表构造的字典树中每一个节点有着一个数据域来存放该点代表的字符和26个指针分别指向a(A)~z(Z)26个可能出现的子字符,在寻找某个字符串是否出现时,从根节点出发不断向下查找配对,如果到了最后一个字符都存在则表示该前缀存在 (2)字典树的二维数组构建及查找 用二维数组tree[i][j]来标识一颗字典树,其中i

Spring MVC 学习总结(七)——FreeMarker模板引擎与动态页面静态化

模板引擎可以让程序实现界面与数据分离,业务代码与逻辑代码的分离,这就提升了开发效率,良好的设计也使得代码复用变得更加容易.一般的模板引擎都包含一个模板解析器和一套标记语言,好的模板引擎有简洁的语法规则.强大的功能.高效的渲染效率.详尽的帮助说明与不断的更新与维护.常见的前端模板引擎有: 常用的java后台模板引擎:jsp.FreeMarker.Velocity等. 请不要迷恋速度,为了推广的测试可能是片面的,好的模板引擎经得起时间考验,建议大家选择成熟的.常用的模板引擎.另外不管前后端的模板引擎

(转)字典树(讲解+模板)

又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高. 字典树与字典很相似,当你要查一个单词是不是在字典树中,首先看单词的第一个字母是不是在字典的第一层,如果不在,说明字典树里没有该单词,如果在就在该字母的孩子节点里找是不是有单词的第二个字母,没有说明没有该单词,有的话用同样的方法继续

Asp.net动态页面静态化之字典哈希表的输出已及遍历判断的实现

Asp.net动态页面静态化之字典哈希表的输出已经遍历判断的实现 using System; using System.Collections.Generic; using System.Linq; using System.Web; using NVelocity.Runtime; using NVelocity; using NVelocity.App; using System.Collections; namespace czbk { /// <summary> /// diction

静态字典树

动态字典树每次都要new一个内存来操作,所以耗时也是较多的:所以我们可以先一次性开辟出足够的空间,然后模拟动态字典树的创建查找过程来写出相应的静态字典树. 代码都差不多,主要是你得先学会了动态字典树:接下来的事情就是模拟了,,,模拟,,模拟. 结构定义: struct Trie { int next[26]; int cnt; // 根据需要灵活变动 void Init() { cnt = 0; _clr(next, 0); } }trie[N]; int size; // 节点标知 字典树创建

Asp.net动态页面静态化之初始NVelocity模板引擎

Asp.net动态页面静态化之初始NVelocity模板引擎 静态页面是网页的代码都在页面中,不须要运行asp,php,jsp,.net等程序生成client网页代码的网页,静态页面网址中一般不含"?"."="."&"等特殊符号. 静态页面不能自主管理公布更新的页面,假设想更新网页内容,要通过FTP软件把文件DOWN下来用网页制作软件改动(通过fso等技术例外) 常见的静态页面举例:.html扩展名的..htm扩展名的. 注意:静态页面并

字典树模板题 POJ 2503

1 #include <cstdio> 2 #include <cstring> 3 4 char en[11],fr[11]; 5 int st; 6 struct Tire{ 7 int next[26]; 8 char eng[11]; 9 }node[200005]; 10 void insert(char *s,int cur) 11 { 12 if(*s){ 13 if(!node[cur].next[*s-'a']) 14 node[cur].next[*s-'a']

模板——字典树Trie Tree

/*字典序模板*/ #define MAX 26 //每层有多少种类 typedef struct trie { trie *next[MAX]; int v;//一个字典树到此有多少相同前缀的数目 }; trie *root; void creat_trie(char *str) { int len=strlen(str); trie *p=root,*q; for(int i=0;i<len;i++) { int id=str[i]-'a'; if(p->next[id]==NULL) {