0x16 Trie

这章刷的真带劲 嘿嘿

裸题

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;

struct Trie
{
    int c,w[30];
    Trie(){c=0;memset(w,0,sizeof(w));}
}tr[1100000];int trlen;
char ss[1100000];
void maketree()
{
    int now=0,len=strlen(ss+1);
    for(int i=1;i<=len;i++)
    {
        int x=ss[i]-‘a‘+1;
        if(tr[now].w[x]==0)
            tr[now].w[x]=++trlen;
        now=tr[now].w[x];
    }
    tr[now].c++;
}
int getsum()
{
    int now=0,sum=0,len=strlen(ss+1);
    for(int i=1;i<=len;i++)
    {
        int x=ss[i]-‘a‘+1;
        if(tr[now].w[x]==0)return sum;
        now=tr[now].w[x];
        sum+=tr[now].c;
    }
    return sum;
}
int main()
{
    int n,Q;
    scanf("%d%d",&n,&Q);
    trlen=0;
    for(int i=1;i<=n;i++)
        scanf("%s",ss+1), maketree();

    while(Q--)
    {
        scanf("%s",ss+1);
        printf("%d\n",getsum());
    }
    return 0;
}

前缀统计

字典树算最大异或和的老套路

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;

struct Trie
{
    int c,w[2];
    Trie(){c=0;memset(w,0,sizeof(w));}
}tr[3100000];int trlen;
int D;

int mmax;
void ask()
{
    int now=0,sum=0;
    for(int i=1;i<=31;i++)
    {
        int x= ( D&(1<<(31-i)) ) ? 0:1;
        if(tr[now].w[x]!=0)
        {
            sum+=(1<<(31-i));
            now=tr[now].w[x];
        }
        else now=tr[now].w[x^1];
    }
    mmax=max(mmax,sum);
}
void insert()
{
    int now=0;
    for(int i=1;i<=31;i++)
    {
        int x= ( D&(1<<(31-i)) ) ? 1:0;
        if(tr[now].w[x]==0)
            tr[now].w[x]=++trlen;
        now=tr[now].w[x];
    }
}

int main()
{
    int n;mmax=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&D);
        if(i!=1)ask();
        insert();
    }
    printf("%d\n",mmax);
    return 0;
}

The XOR Largest Pair

同上,变形一下就行了,注意字典树的清空啊!!

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;

struct Trie
{
    int w[2];
}tr[6100000];int trlen;
int D,mmax,c[210000];
void ask()
{
    int now=0,sum=0;
    for(int i=1;i<=31;i++)
    {
        int x= ( D&(1<<(31-i)) ) ? 0:1;
        if(tr[now].w[x]!=0)
        {
            sum+=(1<<(31-i));
            now=tr[now].w[x];
        }
        else now=tr[now].w[x^1];
    }
    mmax=max(mmax,sum);
}
void insert()
{
    int now=0;
    for(int i=1;i<=31;i++)
    {
        int x= ( D&(1<<(31-i)) ) ? 1:0;
        if(tr[now].w[x]==0)
            tr[now].w[x]=++trlen, tr[trlen].w[0]=tr[trlen].w[1]=0;
        now=tr[now].w[x];
    }
}

struct node
{
    int x,y,d,next;
}a[410000];int len,last[210000];
void ins(int x,int y,int d)
{
    len++;
    a[len].x=x;a[len].y=y;a[len].d=d;
    a[len].next=last[x];last[x]=len;
}
void dfs(int x,int F)
{
    for(int k=last[x];k;k=a[k].next)
    {
        int y=a[k].y;
        if(y!=F)
        {
            c[y]=c[x]^a[k].d;
            dfs(y,x);
        }
    }
}

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        len=0;memset(last,0,sizeof(last));
        for(int i=1;i<n;i++)
        {
            int x,y,d;
            scanf("%d%d%d",&x,&y,&d);x++,y++;
            ins(x,y,d);ins(y,x,d);
        }
        c[1]=0;dfs(1,0);

        mmax=0;trlen=0;tr[0].w[0]=tr[0].w[1]=0;
        for(int i=1;i<=n;i++)
        {
            D=c[i];
            if(i!=1)ask();
            insert();
        }
        printf("%d\n",mmax);
    }
    return 0;
}

poj3764

原文地址:https://www.cnblogs.com/AKCqhzdy/p/9255616.html

时间: 2024-10-22 05:37:42

0x16 Trie的相关文章

HDU 1075 What Are You Talking About (Trie树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1075 map可以过...我上的字典树,小bug有点尴尬,题目没有明确给出数据范围也是无奈. 贡献了几次RE 一次WA.尴尬.discuss里面有个说注意前缀的到是给了点tip.总体来说不错 代码: 1 #define _CRT_SECURE_NO_WARNINGS 2 #include <functional> 3 #include <algorithm> 4 #include <

POJ2778 DNA Sequence Trie+矩阵乘法

题意:给定N个有A C G T组成的字符串,求长度为L的仅由A C G T组成的字符串中有多少个是不含给定的N个字符串的题解: 首先我们把所有的模式串(给定的DNA序列)建Trie,假定我们有一个匹配串,并且在匹配过程到S[i]这个字符时匹配到了Trie上的某个节点t,那么有两种可能: 匹配失败:t->child[S[i]]为空,跳转到t->fail,因此t->fail一定不能是某个模式串的结尾: 匹配成功:跳转到t->child[S[i+1]],因此t->child[S[i

poj3630 Phone List (trie树模板题)

Phone List Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 26328   Accepted: 7938 Description Given a list of phone numbers, determine if it is consistent in the sense that no number is the prefix of another. Let's say the phone catalogu

从Trie谈到AC自动机

ZJOI的SAM让我深受打击,WJZ大神怒D陈老师之T3是SAM裸题orz...我还怎么混?暂且写篇`从Trie谈到AC自动机`骗骗经验. Trie Trie是一种好玩的数据结构.它的每个结点存的是字母,因此得名`字母树`. 出一张图让大家感受下. (image powered by SaiBu NaoCu) 上面那是一棵插入了 ape,app,applicant,application,bake,ban,banana 等词的Trie.红色结点表示接受态. 显然,查找时只需顺着链照下来,插入只需

【BZOJ2741】【块状链表+可持久化trie】FOTILE模拟赛L

Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 ... xor Aj),其中l<=i<=j<=r. 为了体现在线操作,对于一个询问(x,y): l = min ( ((x+lastans) mod N)+1 , ((y+lastans) mod N)+1 ).r = max ( ((x+lastans) mod N)+1 , ((y+last

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

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

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

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

Trie树学习2

数组实现的Trie树 字符容量有限,可以使用链表实现更为大容量的Trie #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <vector> #include <map> #include <set> #include <algorithm> #include <cstdlib> #

trie树(字典树)

1. trie树,又名字典树,顾名思义,它是可以用来作字符串查找的数据结构,它的查找效率比散列表还要高. trie树的建树: 比如有字符串"ab" ,"adb","adc"   可以建立字典树如图: 树的根节点head不存储信息,它有26个next指针,分别对应着字符a,b,c等.插入字符串ab时,next['a'-'a']即next[0]为空,这是申请一个结点放在next[0]的位置,插入字符串db时,next['d'-'a']即next[3]