• 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;
    }
  • 相关阅读:
    golang学习笔记 ---接口
    golang学习笔记 --类与方法
    golang学习笔记--面向对象编程
    golang学习笔记---错误处理
    golang学习笔记---defer[延迟函数]
    golang学习笔记--闭包
    golang学习笔记---函数
    SSD技术扫盲之:什么是NVMe? NVMe SSD有什么特点?
    云原生存储系列文章:云原生应用的基石
    发财树的养殖方法
  • 原文地址:https://www.cnblogs.com/Yumesenya/p/6086956.html
Copyright © 2020-2023  润新知