zoukankan      html  css  js  c++  java
  • LightOJ 1269

    **题意:**给出一串序列,求区间连续异或值的最大和最小。 **思路:**如果不是出在专题里,想不到可以用字典树做。先求前缀异或值,转为二进制,加入Trie树中,如果要求最大,就是尽可能走和当前位数字相反的,这样异或值才能保持最大,最小,就尽可能走和当前位数字相同的,走到尽头异或前缀值。
    /** @Date    : 2016-11-10-16.34
    * @Author : Lweleth (SoungEarlf@gmail.com)
    * @Link : https://github.com/
    * @Version :
    */
    #include <stdio.h>
    #include <iostream>
    #include <string.h>
    #include <algorithm>
    #include <utility>
    #include <vector>
    #include <map>
    #include <set>
    #include <string>
    #include <stack>
    #include <queue>
    #define LL long long
    #define MMF(x) memset((x),0,sizeof(x))
    #define MMI(x) memset((x), INF, sizeof(x))
    using namespace std;

    const int INF = 0x3f3f3f3f;
    const int N = 5e4+20;

    struct yuu
    {
    int cnt;
    int val[35*N];//前缀和值
    int nxp[35*N][2];

    int init()
    {
    MMF(nxp[0]);
    MMF(val);
    cnt = 1;
    }

    int idx(char c)
    {
    return c - '0';
    }

    int insert(char *s, int v)//
    {
    int u = 0;
    int x = strlen(s);
    for(int i = 0; i < x; i++)
    {
    int c = idx(s[i]);
    if(nxp[u][c] == 0)
    {
    MMF(nxp[cnt]);
    nxp[u][c] = cnt;
    cnt++;
    }
    u = nxp[u][c];
    }
    val[u] = v;
    }

    int find(char *s, int a, int ma)//ma 代表 是否找相反的
    {
    int u = 0;
    int x = strlen(s);

    for(int i = 0; i < x; i++)
    {
    int c = idx(s[i]);
    int v = c ^ ma;
    if(nxp[u][v] == 0)
    {
    v ^= 1;
    }
    u = nxp[u][v];
    }
    return val[u] ^ a;//尽头赋值
    }
    }tt;

    void atoi_(char *s, int x)
    {
    for(int i = 31; i >= 0; i--)
    {
    s[i] = ((x >> i) & 1) + '0';
    }
    s[32] = '';
    reverse(s, s + 32);
    // for(int i = 0; i <= 32; i++)
    // cout << s[i] ;
    // cout << endl;
    }

    int a[N];
    int sum[N];
    char t[35];

    int main()
    {
    int T;
    int cnt = 0;
    cin >> T;
    while(T--)
    {
    int n;
    scanf("%d", &n);
    sum[0] = 0;
    for(int i = 1; i <= n; i++)
    {
    scanf("%d", a + i);
    sum[i] = sum[i-1] ^ a[i];
    }
    tt.init();
    atoi_(t, 0);
    tt.insert(t, 0);

    int ma = -INF;
    int mi = INF;
    for(int i = 1; i <= n; i++)
    {
    atoi_(t, sum[i]);
    ma = max(ma, tt.find(t, sum[i], 1));
    mi = min(mi, tt.find(t, sum[i], 0));
    tt.insert(t, sum[i]);
    }
    printf("Case %d: %d %d ", ++cnt, ma, mi);
    }
    return 0;
    }
  • 相关阅读:
    springboot + druid
    springboot + lombok
    springboot + swagger2
    Timer / TimerTask 源码解析
    Nginx(三) upstream目前支持的5种分配方式
    Nginx(一) 配置负载均衡
    Intellij IDEA 2018.02 激活方法
    Class常量池、String常量池、运行时常量池
    IntelliJ 结合 javap 实现class文件分析(反编译)
    关于登录注册的简单实现方式
  • 原文地址:https://www.cnblogs.com/Yumesenya/p/6086956.html
Copyright © 2011-2022 走看看