• 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
  • 相关阅读:
    android闹钟
    Android API : SMS短信服务处理
    Windows Mobile Web方式下载文件
    摘录的一点东西,很有感触
    Net Compact Framework 基础篇(6) Socket通信 【转】
    实例讲解.NET中资源文件的创建与使用
    如何安装Apk文件到Android模拟器
    __forceinline 关键字
    Allocate aligned memory
    linux svn安装和配置,不结合apache
  • 原文地址:https://www.cnblogs.com/AKCqhzdy/p/9255616.html
Copyright © 2020-2023  润新知