坑爹的题目。不过不能说不是一道挺好的题目。

坑主要坑在,妹的我一样的复杂度,写的姿势略差了点然后就一直超时。

比赛的时候我还直接就看错题目,把AND运算看成了OR。。。还敲完交了一发。

这题很容易想到:

因为给出的数字只有13位,所以每位用2位二进制表示。

如:

00 1的个数为偶数,最后的结果为0

01 1的个数为奇数,最后的结果为0

10 1的个数为偶数,最后的结果为1

11 1的个数为奇数,最后的结果为1

这样就可以转移求出最后的结果。然而这样做的复杂度是O(50*2^26)>1e9. 肯定不行。

仔细想想我们可以发现,当出现了0以后结果一定为0。这样用2位二进制位表示这个信息有些多余了。我们可以用三进制0,1,2和多余附加的一个标志位来表示这种信息。

如果某一位一直都是1则用0表示,如果出现了0,则用1,2分别代表出现奇数个1和偶数个1。 再配上附加的标志位来记录当前为止已加入数个数的奇偶性。分析下就可以发现,这样是能够把每一种情况表示出来的。

原先得用2^26=67108864种状态表示,现在只需要2*3^13=3188646. 直接就相差了20倍。wonderful!

然后剩下来还有一个关键问题,怎样将转移的O(13)->O(1)

PS:我原先的思想是,预处理,对于2*3^13的每种状态对应2^26某一种。结果一直TLE,这种做法会有比较大的内存消耗,而且预处理时间也较长。

可以预处理7位的所有情况,也就是把13位分成两半,因为对这两半的操作都是一样的,所以只需要预处理一半就行了,然后空间消耗变得非常小,转移操作变成O(1).

Rikka with Sequence

时间限制:20000ms
单点时限:2000ms
内存限制:512MB

描述

众所周知,萌萌哒六花不擅长数学,所以勇太给了她一些数学问题做练习,其中有一道是这样的:

勇太有n个[0,8192)中的整数,现在六花可以从中选出若干个数(不可以不取),她的方案需要满足她选出的所有数的异或和恰好等于它们AND(二进制与运算)起来的值,现在勇太想让六花求出满足条件的方案数。

当然,这个问题对于萌萌哒六花来说实在是太难了,你可以帮帮她吗?

输入

第一行一个整数n,接下来一行里n个整数。

1<=n<=50

输出

输出一行表示答案。

样例输入
3
1 1 1
样例输出
4

//
// main.cpp
// hiho19
//
// Created by 陈加寿 on 16/3/20.
// Copyright © 2016年 chenhuan001. All rights reserved.
// #include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <time.h>
#include <math.h>
#include <algorithm>
using namespace std; #define K 8200 int g[];
long long dp[][][];
int chg[][][];
int chg1[][][]; void init()
{
int save[];
memset(save,,sizeof(save));
for(int i=;i<;i++)
{
for(int j=;j<(<<);j++)
{
for(int p=;p<;p++)
{
//然后你想怎么搞就怎么搞吧。
int tmp1=,tmp2=;
for(int k=;k<;k++)
{
if(save[k] == )
{
tmp1 |= (<<k);
}
}
for(int k=;k<;k++)
{
if(save[k] == )
{
if(p) tmp2|=(<<k);
}
else if(save[k] == ) tmp2|=(<<k);
}
tmp1 &= j;
tmp2 ^= j;
//然后再转变回去。
int tmp=;
int sum=;
for(int k=;k<;k++)
{
if( (tmp1&(<<k))!= )
{
;
}
else if( (tmp2&(<<k))!= )
{
sum += tmp;
}
else if( (tmp2&(<<k))== )
{
sum += *tmp;
}
tmp *=;
}
chg[i][j][p] = sum;
chg1[i][j][p] = (chg[i][j][p]/)*;
}
} int tj=;
save[tj]++;
while(save[tj]>=)
{
save[tj+]++;
save[tj]=;
tj++;
} }
} //是与运算
//clock_t be,ed;
//void checktime()
//{
// ed=clock();
// cout<<(double)(ed-be)/CLOCKS_PER_SEC<<endl;
// be=clock();
//
//}
int main() {
//看错题目??? 不思考看题解??? 你是SB吗
int n;
cin>>n; // 我真是日了狗了
for(int i=;i<n;i++)
{
scanf("%d",g+i);
//13 = 1594323(nn,13);
//1594323 = 1594323(1594323,tcnt);
}
// if(13 == 0)
// {
// cout<<((1LL)<<n)-1<<endl;
// return 0;
// } //be=clock();
init();
//checktime(); int a=;
memset(dp,,sizeof(dp));
dp[a][][] = ; for(int i=;i<n;i++)
{
memset(dp[a^],,sizeof(dp[a^])); int up=g[i]>>;//这个应该是移6位吧
int down = g[i]&((<<)-); int j1=,j2=;
for(int j=;j<;j++)
{
j2= j/; j1=j%;
for(int p=;p<;p++)
{
//dp[a^1][j] += dp[a][j];
int sum=;
if(dp[a][j][p] != )
{
dp[a^][j][p] += dp[a][j][p];
sum = chg1[j2][up][p]+chg[j1][down][p];
dp[a^][sum][p^] += dp[a][j][p];
} }
// j2++;
// if(j2>=(2187))
// {
// j2=0;j1++;
// }
}
a = a^;
}
//checktime(); long long ans=;
int save[];
memset(save, , sizeof(save));
for(int j=;j<;j++)
{
for(int p=;p<;p++)
{
int flag=;
for(int k=;k<;k++)
if(save[k]==)
{
flag=;
break;
}
else if(save[k]== && p==)
{
flag=;
break;
} if(flag==) ans += dp[a][j][p];
}
int tj=;
save[tj]++;
while(save[tj]>=)
{
save[tj+]++;
save[tj]=;
tj++;
}
}
//checktime(); cout<<ans<<endl; return ;
}

hihocoder 1279(状压)的更多相关文章

  1. HihoCoder - 1048 状压DP 经典题

    hihocoder题解说的十分清晰了,这份代码就是从讲解里学习的 方案数就是不断枚举合法状态下横放竖放或两者均可 合法判断的依据是记录当前行和下一行的状态 防止重复枚举的方法是先按行后按列 递归基瞎写 ...

  2. HihoCoder - 1044 状压DP 初步

    本题主要难在状态的转移 定义\(dp[i][j]:\)前\(i\)个中\(j\)集合范围内的最优解 \(j\)定义为\(p_1,p_2,...,p_{m-1}\),若第\(i-j+1\)个选定,则\( ...

  3. hihocoder 1829 - 压缩字符串 - [状压+暴力枚举][2018ICPC北京网络预赛B题]

    题目链接:https://hihocoder.com/problemset/problem/1829 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 Lara Croft, ...

  4. hihocoder #1608 : Jerry的奶酪(状压dp)

    题目链接:http://hihocoder.com/problemset/problem/1608 题解:就是一道简单的状压dp由于dfs过程中只需要几个点之间的转移所以只要预处理一下几个点就行. # ...

  5. hihoCoder#1743:K-偏差排列(矩阵快速幂+状压dp)

    题意 如果一个 \(1\to N\) 的排列 \(P=[P_1, P_2, ... P_N]\) 中的任意元素 \(P_i\) 都满足 \(|P_i-i| ≤ K\) ,我们就称 \(P\) 是 \( ...

  6. HihoCoder - 1794:拼三角形 (状压DP)

    描述 给定 n 根木棍,第 i 根长度为 ai 现在你想用他们拼成尽量多的面积大于 0 的三角形,要求每根木棍只能被用一次,且不能折断 请你求出最多能拼出几个 输入 第一行一个正整数 n 第二行 n ...

  7. HDU5731 Solid Dominoes Tilings 状压dp+状压容斥

    题意:给定n,m的矩阵,就是求稳定的骨牌完美覆盖,也就是相邻的两行或者两列都至少有一个骨牌 分析:第一步: 如果是单单求骨牌完美覆盖,请先去学基础的插头dp(其实也是基础的状压dp)骨牌覆盖 hiho ...

  8. BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3336  Solved: 1936[Submit][ ...

  9. 【BZOJ-4197】寿司晚宴 状压DP

    4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 694  Solved: 440[Submit][Status] ...

  10. nefu1109 游戏争霸赛(状压dp)

    题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...

随机推荐

  1. 怎样实现广度优先遍历(BFS)

    BFS过程: 一:訪问顶点V,并标记V为已经訪问 二:顶点V入队列 三:假设队列非空.进行运行,否则算法结束 四:出队列取得对头顶点u,假设顶点未被訪问,就訪问该顶点,并标记该顶点为已经訪问 五:查找 ...

  2. Zend Framework(一) windows8.1下配置zend framework1.12

    windows8.1下配置zend framework1.12配置步骤: 1.     下载 zend framework1.12库 2.      创建zend frameworkproject 2 ...

  3. 【Android Studio探索之路系列】之中的一个:Android Studio开篇

    作者:郭孝星 微博:郭孝星的新浪微博 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.co ...

  4. 【DB2】SQL0501N FETCH 语句或 CLOSE 语句中指定的游标尚未打开,或者游标标量函数引用中的游标变量尚未打开。 SQLSTATE=24501

    在DB2中建立存储过程时使用了隐式游标,在调用的时候报错如下: SQL0501N  FETCH 语句或 CLOSE 语句中指定的游标尚未打开,或者游标标量函数引用中的游标变量尚未打开.  SQLSTA ...

  5. S2S3H4 整合代码示例

    主要代码列举:   web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app versi ...

  6. 【MyBatis学习11】MyBatis中的延迟加载

    1. 什么是延迟加载 举个例子:如果查询订单并且关联查询用户信息.如果先查询订单信息即可满足要求,当我们需要查询用户信息时再查询用户信息.把对用户信息的按需去查询就是延迟加载. 所以延迟加载即先从单表 ...

  7. javascript 字符串对象新增 replaceAll 方法

    String.prototype.replaceAll = function(reallyDo, replaceWith, ignoreCase) { if(! RegExp.prototype.is ...

  8. tomcat的安装、配置

    简单介绍 Tomcat server是一个免费的开放源码的Web 应用server,属于轻量级应用server, 在中小型系统和并发訪问用户不是非常多的场合下被普遍使用,是开发和调试JSP 程序的首选 ...

  9. Java 8 Lambda表达式介绍

    Lambda是什么? Lambda是一个匿名函数,我们可以把Lambda理解为是一段可以传递的代码.可以写出简洁.灵活的代码.作为一种更紧凑的代码风格,使java的语言表达能力得到提升. 可以这么说l ...

  10. INSERT 失败,因为下列 SET 选项的设置不正确: 'ARITHABORT'

    当你在SQL Server上试图更新一个索引视图引用的表时,你可能回收到如下有错误 INSERT 失败,因为下列 SET 选项的设置不正确: 'ARITHABORT' 你必须在TSQL前Set ARI ...