HDU 5715

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

代码如下

#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 5677
下一篇HDU 5713
想对作者说点什么? 我来说一句

动态规划背包问题入门

2011年07月07日 328KB 下载

HDU DP动态规划

2010年03月31日 454KB 下载

hdu acm 教案(4)

2008年10月02日 839KB 下载

hdu acm 教案(11)

2008年10月02日 135KB 下载

hdu acm 教案(3)

2008年10月02日 309KB 下载

没有更多推荐了,返回首页

关闭
关闭