HDU 5715

原创 2016年05月31日 14:45:44

看的别人的博客写的很好点击打开链接

代码如下

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>

using namespace std;
typedef long long ll;
#define rep(i,n) for(int i = 0 ; i<(int)n;i++)
#define rep1(i,x,y) for(int i=(int)x;i<=(int)y;i++)
#define lowbit(x) (x&-x)

const int N =10010;

struct trie{
    int son[N*32][2], tim[N*32], tot;
    void init(){
        son[0][0] = son[0][1] = tot = 0;
        tim[0] = 1;
    }
    void insert(int val){
        int t = 0;
        for(int i = 30; i >= 0; --i){
            int c = (val >> i) & 1;
            if(son[t][c] == 0){
                son[t][c] = ++tot;
                son[tot][0] = son[tot][1] = tim[tot] = 0;
            }
            t = son[t][c];
            tim[t]++;
        }
    }
    void del(int val){
        int t = 0;
        for(int i = 30; i >= 0; --i){
            int c = (val >> i) & 1;
            int tt = t;
            t = son[t][c];
            tim[t]--;
            if(tim[t] == 0){
                son[tt][c] = 0;
                break;
            }
        }
    }
    int query(int val){
        int ret = 0, t = 0;
        for(int i = 30; i >= 0; --i){
            int c = (val >> i) & 1;
            if(son[t][c^1]){
                t = son[t][c^1];
                ret += (1 << i);
            }
            else {
                t = son[t][c];
            }
        }
        return ret;
    }
}tree[15];

int n,m,L;
bool d[N][11];
int a[N];
bool judge(int x){
    memset(d , 0 , sizeof(d));
    d[0][0] = 1;
    rep(i , m + 1) tree[i].init();
    tree[0].insert(0);

    for(int i = 1 ; i<=n ; i++){
         rep(j , m){
             if(i > L && d[i - L - 1][j])
                   tree[j].del(a[i - L - 1]);
         }
         for(int j = m ; j>=1 ; j--){
             if(tree[j - 1].query(a[i]) >= x){
                    d[i][j] = true;
                    tree[j].insert(a[i]);
             }
         }
    }
    return d[n][m];
}
int main()
{
    int T , kase = 1;
    scanf("%d",&T);
    while(T--){
        scanf("%d %d %d",&n,&m,&L);
        rep1(i,1,n) scanf("%d",&a[i]) , a[i]^=a[i-1];
        int l = 0 , r = 1e9 + 100;
        while(l < r){
            //cout<<l <<" "<<r<<endl;
            int mid =(l + r)/2;
            if(judge(mid)) l = mid + 1;
            else r = mid;
        }
        printf("Case #%d:\n%d\n",kase++,l - 1);
    }
    return 0;
}


HDU 5715 & 2016"百度之星" 复赛(Astar Round3)1004 XOR游戏(Trie)

题意:众所周知,度度熊喜欢XOR运算(XOR百科)。 今天,它发明了一种XOR新游戏,最开始,它有一个长度为N的数组,度度熊可以任意添加分割线,将数组划分为M段,且每段长度小于等于L。 当然这是个...

[DevExpress]ASP.NET動態設定XtraReport報表參數的方式 5715  ASP.NET  檢舉文章 在ASP.NET中要如何動態設定XtraReport報表參數,或

[DevExpress]ASP.NET動態設定XtraReport報表參數的方式 5715ASP.NET檢舉文章 在ASP.NET中要如何動態設定XtraReport報表參數,或是...
  • xzmdir
  • xzmdir
  • 2016年03月03日 01:00
  • 302

TV5715.视频处理芯片

  • 2013年11月25日 18:37
  • 135KB
  • 下载

hdu2000-2012(C++)答案

  • 2017年08月21日 17:24
  • 6KB
  • 下载

HDU1297 Children’s Queue【递推+大整数】

Children’s Queue Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)...

.net作业源代码hdu

  • 2013年08月08日 19:50
  • 1.84MB
  • 下载

hdu1290解题报告

  • 2014年07月10日 20:42
  • 17KB
  • 下载

逃离迷宫 HDU - 1728 深度优先搜索

传送门 解题思路:既然找转向次数最少,没有限制移动几步,只要能到达终点即可,因此选择深度优先搜索,并且剪枝, 只要转向次数超过了k那就不再继续,这样只要到达终点就是答案。 但是还有个问题就...
  • lcuwb
  • lcuwb
  • 2017年12月10日 21:34
  • 0

hdu acm1166线段树

  • 2014年05月03日 18:41
  • 2KB
  • 下载

ACM HDU题目分类

  • 2013年08月21日 12:53
  • 33KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HDU 5715
举报原因:
原因补充:

(最多只允许输入30个字)