zoukankan      html  css  js  c++  java
  • 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
    ",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
    ",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
    ",mmax);
        }
        return 0;
    }
    poj3764
  • 相关阅读:
    Lily.Core.FileDataProvider文件管理使用范例。
    CruiseControl.NET,Nant持续集成(1)
    如何为当前进程设置环境变量?
    unix时间戳与datetime的转换函数
    Mac 平台下功能强大的Shimo软件使用指南
    如何解决源码包安装时的依赖性问题
    《Linux企业应用案例精解》一书配套视频发布
    ZoneMinder配置与使用
    网站优化IIS7下静态文件的优化
    WIN7常用功能的介绍
  • 原文地址:https://www.cnblogs.com/AKCqhzdy/p/9255616.html
Copyright © 2011-2022 走看看