zoukankan      html  css  js  c++  java
  • 51nod1295

    题解:

    考虑到是异或,那么就是位运算

    位运算会想到什么?当然是按位拆开

    那么就变成了一个个的字符串

    考虑了trie

    可是貌似有多个问题

    那么就用可持久化trie!

    代码:

    #include<bits/stdc++.h> 
    using namespace std;
    const int N=50005,M=1550005,L=30;
    int tot,n,q,son[M][2],sum[M],root[N],bz[L+5];
    int read()
    {
        int x=0;char c;
        for (c=getchar();c<'0'||c>'9';c=getchar());
        for (;c>='0'&&c<='9';c=getchar())x=x*10+c-48;
        return x;
    }
    void insert(int v,int &x,int y)
    {
        x=++tot;
        memcpy(son[x],son[y],8);
        sum[x]=sum[y]+1;
        if (!v) return;
        insert(v-1,son[x][bz[v-1]],son[y][bz[v-1]]);
    }
    int find(int v,int x,int y)
    {
        if (!v) return 0;
        if (sum[son[x][bz[v-1]]]>sum[son[y][bz[v-1]]])
         return find(v-1,son[x][bz[v-1]],son[y][bz[v-1]])+(1<<(v-1));
        return find(v-1,son[x][1-bz[v-1]],son[y][1-bz[v-1]]);
    }
    int main()
    {
        n=read();q=read();
        for (int i=1;i<=n;i++)
         {
            int x=read();
            for (int j=0;j<L;x/=2)bz[j++]=x%2;
            insert(L,root[i],root[i-1]);
         }
        while (q--)
         {
            int x=read(),l=read(),r=read();
            for (int j=0;j<L;x/=2)bz[j++]=1-(x%2);
            printf("%d
    ",find(L,root[r+1],root[l]));
         }
    }
  • 相关阅读:
    常见设备标记长度查询
    word怎么在方框中打对号
    shell dict 操作
    词表数据转换
    GoLand tool tips
    mac使用技巧
    人生三大陷阱
    【js重学系列】执行上下文
    uniapp-ui库
    【js重学系列】instanceof
  • 原文地址:https://www.cnblogs.com/xuanyiming/p/7563200.html
Copyright © 2011-2022 走看看