[填坑][主线任务]Trie树

当时学过QAQ,无奈早已忘光,只剩一个概念2333

重新捡起来,同时感谢yymxw的指导(才怪)

负责任的粘贴一下网上的概念:

Trie树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。

Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。
Trie树的基本性质可以归纳为: 
(1)根节点不包含字符,除根节点意外每个节点只包含一个字符。
(2)从根节点到某一个节点,路径上经过的字符连接起来,为该节点对应的字符串。 
(3)每个节点的所有子节点包含的字符串不相同。
Trie树有一些特性:
(1)根节点不包含字符,除根节点外每一个节点都只包含一个字符。
(2)从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。
(3)每个节点的所有子节点包含的字符都不相同。
(4)如果字符的种数为n,则每个结点的出度为n,这也是空间换时间的体现,浪费了很多的空间。
(5)插入查找的复杂度为O(n),n为字符串长度。

开始愉快的刷(shui)题吧~

[Trie树]COGS 1176 月考

非常简单的单词插入与查找是否出现过,Trie树入门必备

#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#define pos(i,a,b) for(int i=(a);i<=(b);i++)
#define pos2(i,a,b) for(int i=(a);i>=(b);i--)
#define N 5000
using namespace std;
struct Trie {
    Trie *ch[70];//此节点有几种可能的字符 ,不要开炸内存
    int dfn;//判断此节点是否为单词
    Trie(){memset(ch,0,sizeof(ch));dfn=0;}
}*root;
int n,m;
void insert(char *s) {
    int len=strlen(s);
    Trie *now=root;
    pos(i,0,len-1) {
        if(now->ch[s[i]-‘A‘]==NULL)
			now->ch[s[i]-‘A‘]=new Trie();
        now=now->ch[s[i]-‘A‘];
    }
    now->dfn=1;
}
int find(char *s){
	int len=strlen(s);
	Trie *now=root;
	pos(i,0,len-1){
		if(now->ch[s[i]-‘A‘]==NULL) return 0;
		now=now->ch[s[i]-‘A‘];
	}
	if(now->dfn==1) return 1;
	else return 0;
}
int main() {
    scanf("%d",&n);
    root=new Trie();
    pos(i,1,n) {
        char s[60];
        scanf("%s",s);
        insert(s);
    }
    scanf("%d",&m);
    int ans(0);
    pos(i,1,m){
    	char s[60];
        scanf("%s",s);
        if(find(s)) ans++;
	}
	cout<<ans;
    return 0;
}

  

时间: 2024-08-29 11:30:24

[填坑][主线任务]Trie树的相关文章

[填坑][主线任务]历年NOIP刷题计划

今天又是喜闻乐见的非考试日,那么今天做点什么呢== 前些日子的主线任务陆陆续续(接近)完成了,好多蒙蔽的没学好的算法都算是入门补坑了 我听学长说,做题的顺序是:NOIP真题->NOIP模拟题->专项练习->杂题 啊哈!最重要的真题我还没做几道呢...于是这两天填填这个坑吧 [NOIP2016 Day1 T2]天天爱跑步 NOIP2016最难的题没有之一QAQ,原来做过一直没过,今天重新听讲解,总算打了出来 [NOIP2015 Day2 T3]运输计划 压轴题防AK,最后一个点及其凶残,并

[填坑][主线任务]MP&amp;KMP算法

当时一直就没有理解QAQ,觉得会hash就够了,但是想到fail数组有很多神奇的妙用,于是来填这个坑 先讲MP算法: 我就直接说fail数组的含义吧(从0开始字符串下标): fail[i]表示0~i-1这个串的最长border的长度,同时也是重新开始匹配的将要匹配的那个位置下标. 举个小栗子:对于字符串 abcdabd fail[6]=2,即abcdab的最长border的长度为2(ab),匹配失败的时候,下标跳到fail[6](为2)再来匹配,即从‘c’字母开始匹配(因为前边的‘ab’已经匹配

HDU 1556 Color the ball(树状数组)(填坑)

题目地址:HDU 1556 因为听别人说树状数组能做的线段树都可以,所以也一直没学,但是现在遇到好多题卡线段树...跪了..所以就学一下填填坑. 这题应该是树状数组的入门题了.不多说了. 代码如下: #include <iostream> #include <string.h> #include <math.h> #include <queue> #include <algorithm> #include <stdlib.h> #in

[填坑]主席树

首先,可持久化数据结构,CLJ的论文里有讲. 通俗点来讲,就是该数据结构保留历史版本信息,对应的有可持久化链表,可持久化线段树,可持久化树状数组.比如对于线段树更新操作,每次更新新建一棵线段树,那么就有任意一次时间点信息. 当然,这样就非常耗空间,所以,对于线段树,每次只需要对于有更新的节点新建节点,否者可以用前一个版本的顶点(就是连接一下左右孩子就行了),这样,如果每次都是单点更改的话每次也就更改logn个点,空间复杂度nlogn. 接下来我们讲讲什么是主席树(orz 主席). 如果我的理解没

LCT 填坑系列

清华冬令营 T1用了LCT 这个东西以前有写过 然而并不熟练 发现没了板子根本就不会写 只能填一填坑辣 BZOJ 2843 LCT 1 #include <bits/stdc++.h> 2 #define N 30010 3 #define ls c[x][0] 4 #define rs c[x][1] 5 using namespace std; 6 7 inline int read() 8 { 9 int x=0,f=1; char ch=getchar(); 10 while(ch&l

[临时向]蒟蒻的填坑记录

TAT这周开始填坑....这周大概是数据结构吧?来这里记录一下免得自己过几天又开始颓了TAT 1.3:中午看了下zkw线段树,写了bzoj3685...找前驱后缀的姿势不是很科学...不过速度相差不大就懒得改了. 晚上写treap..分别用zkw线段树和treap写了bzoj3224普通平衡树.....正常的treap大概300+ms...zkw线段树190+ms 1.4:中午用treap写了1503郁闷的出纳员....晚上写1058报表统计..弄了一晚上TAT 目测明天重开spaly...

Trie树 + DFS - CSU 1457 Boggle

Boggle Problem's Link: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1457 Mean: 给定n个串,有m个询问. 每个询问给你一个4*4的字符矩阵,你可以在这个字符矩阵中任意字符出发,向四个方向走(已走过的不可重复走),走出一个字符串. 如果n个串中有对应的串和走出的字符串相同,那么需要求出: 1.不同长度的串给了不同的权值,n个串中出现的串的总权值是多少? 2.从出现的字符串中找一个最长的出来,如果有多个,找一个字典

CF282 E Sausage Maximization[trie树]

给n个数 求异或前缀(从前连续取一些数全作异或)和异或后缀(从后连续取一些数全作异或)异或的最大值 好坑啊,指针好坑啊 第一道trie树 简单说下解法(其实壳还是不深): 先异或所有数作为初始后缀 然后从前往后的数逐个从后缀出来,进入前缀, 在这个过程中,都把当前前缀变成二进制压入trie,然后当前后缀变成二进制从高位到低位尽量取和它数位不同的值,沿着trie往下走,得到一个最好的数,然后和后缀异或,维护最大值 简直了,指针就是坑 其实还是自己有点坑 说下遇到的坑吧 一开始没有全存64位数(导致

Codeforces 282E. Sausage Maximization【trie树(非指针版)】

题目大意: 给出一串数,pre[i](前i个数的异或)为a[0]~a[i-1]的异或,post[i](后缀的异或)为a[i]~a[n-1]的异或,求pre[i]^post[j]的最大值(0<=i<=j<=n),其中,pre[0]=0,post[n]=0(表示一个数都不选). 做法: 利用trie树将后缀或者前缀存储起来,首先从pre[n]开始,往前遍历,对于每个前缀,将此时的后缀添加到trie树中,再在trie中寻找与当前前缀异或之后能得到最大的值. 在trie中存储数的时候,将该数的二