Trie字典树

用来查找是否出现某些单词,或者是求最大亦或和

inline void add(char s[])//插入
{
    int u=1;
    for(int i=1;i<=ls;i++)
    {
        int v=s[i]-'a'+1;
        if(!ch[u][v])
        {
            ch[u][v]=++cnt;
        }
        u=ch[u][v];
    }
    point[++num]=u;
}
inline bool solve(char s[])//查找
{
    int u=1;
    for(re i=1;i<=ls;i++)
    {
        int v=s[i]-'a'+1;
        if(!ch[u][v])
        return 0;
        u=ch[u][v];
    }
    return 1;
}
#include<bits/stdc++.h>//求最大亦或和
using namespace std;
int ch[(4*100005)<<5][3],cnt=1;
long long l[4*100005],r[4*100005];
inline void add(int x)
{
    int u=1;
    for(int i=31;i>=0;i--)
    {
        int v=(x&(1<<i))?1:0;
        if(!ch[u][v])
        {
            ch[u][v]=++cnt;
        }
        u=ch[u][v];
    }
}
inline long long work(int x)
{
    int u=1;
    long long ans=0;
    for(int i=31;i>=0;i--)
    {
        int v=(x&(1<<i))?0:1;
        if(ch[u][v])
        {
            ans+=(1<<i);
            u=ch[u][v];
        }
        else
        {
            u=ch[u][!v];
        }
    }
    return ans;
}
int n,now=0;
int x[400005];
long long bns=0;
int main()
{
    scanf("%d",&n);
    add(now);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x[i]);
        now^=x[i];
        add(now);
        l[i]=max(l[i-1],work(now)); 
    }
    memset(ch,0,sizeof(ch));
    add(now=0);
    for(int i=n;i>=1;i--)
    {
        now^=x[i];
        add(now);
        r[i]=max(r[i+1],work(now));
    }
    for(int i=1;i<=n;i++)
    {
        bns=max(bns,l[i]+r[i+1]);
    }
    printf("%lld",bns);
    return 0;
}

https://www.lydsy.com/JudgeOnline/problem.php?id=4260(题目

posted @ 2018-10-16 16:14  Tarjan_fjz  阅读(95)  评论(0编辑  收藏  举报