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

猜你喜欢

转载自www.cnblogs.com/AKCqhzdy/p/9255616.html