http://acm.hdu.edu.cn/showproblem.php?pid=4285 (题目链接)

题意

  求不不能嵌套的回路个数为K的路径方案数。

Solution

  插头dp,时限卡得太紧了,写的我蛋都要碎了T_T。

  插头记录连通情况,对于嵌套,我们在合并连通块的时候,判断一下两侧的插头个数的奇偶。如果是奇数,那么合并后一定会出现嵌套;如果是偶数,那么合并后可能会出现嵌套。

细节

  卡常经验传授:换行不用for一遍;hash不要开小了

代码

// hdu4285
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define LL long long
#define HAS 300007
#define MOD 1000000007
#define inf 2147483640
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std; const int maxh=300010,maxs=1000010,maxd=15;
int a[maxd][maxd],code[maxd],cnts[maxd],n,m,K;
int size[2],tot[2][maxs],num;
int nxt[maxs],head[maxh];
LL s[2][maxs];
char ch[maxd]; void decode(LL st) {
num=st&63,st>>=6;
for (int i=m;i>=0;i--) code[i]=st&7,st>>=3;
}
LL encode(int op,int m) {
int cnt=0;LL st=0;
if (op) {
memset(cnts,-1,sizeof(cnts));cnts[0]=0;
for (int i=0;i<=m;i++) {
if (cnts[code[i]]==-1) cnts[code[i]]=++cnt;
code[i]=cnts[code[i]];
}
}
for (int i=0;i<=m;i++) st=st<<3|code[i];
return st<<6|num;
}
void add(LL tmp,int p,int num) {
int id=tmp%HAS;
for (int i=head[id];i;i=nxt[i])
if (s[p][i]==tmp) {(tot[p][i]+=num)%=MOD;return;}
s[p][++size[p]]=tmp;tot[p][size[p]]=num;
nxt[size[p]]=head[id];head[id]=size[p];
}
void shift() {
for (int i=m;i;i--) code[i]=code[i-1];code[0]=0;
}
int main() {
int T;scanf("%d",&T);
while (T--) {
memset(a,0,sizeof(a));
scanf("%d%d%d",&n,&m,&K);
for (int i=1;i<=n;i++) {
scanf("%s",ch+1);
for (int j=1;j<=m;j++) a[i][j]=ch[j]=='.';
}
int p=0;
size[p]=1;tot[p][1]=1;s[p][1]=0;
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++) {
size[p^=1]=0;
memset(head,0,sizeof(head));
for (int k=1;k<=size[p^1];k++) {
decode(s[p^1][k]);
int left=code[j-1],up=code[j];
if (!a[i][j]) {
code[j-1]=code[j]=0;
//if (j==m) shift();
add(encode(0,j==m ? m-1 : m),p,tot[p^1][k]);
continue;
}
if (left && up) {
if (left==up) {
if (num>=K) continue;
int tmp=0;
for (int l=j+1;l<=m;l++) if (code[l]) tmp++;
if (tmp&1) continue;
num++;code[j-1]=code[j]=0;
//if (j==m) shift();
add(encode(0,j==m ? m-1 : m),p,tot[p^1][k]);
}
else {
for (int l=0;l<=m;l++) if (code[l]==left) code[l]=up;
code[j-1]=code[j]=0;
//if (j==m) shift();
add(encode(1,j==m ? m-1 : m),p,tot[p^1][k]);
}
}
else if (left || up) {
int tmp=left ? left : up;
if (a[i][j+1]) {
code[j-1]=0,code[j]=tmp;
add(encode(0,j==m ? m-1 : m),p,tot[p^1][k]);
}
if (a[i+1][j]) {
code[j-1]=tmp,code[j]=0;
//if (j==m) shift();
add(encode(0,j==m ? m-1 : m),p,tot[p^1][k]);
}
}
else {
if (a[i][j+1] && a[i+1][j]) {
code[j-1]=code[j]=13;
add(encode(1,j==m ? m-1 : m),p,tot[p^1][k]);
}
}
}
}
int ans=0;
for (int i=1;i<=size[p];i++)
if ((s[p][i]&63)==K) (ans+=tot[p][i])%=MOD;
printf("%d\n",ans);
}
return 0;
}

【hdu4285】 circuits的更多相关文章

  1. 【转载】图论 500题——主要为hdu/poj/zoj

    转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  2. SCI&EI 英文PAPER投稿经验【转】

    英文投稿的一点经验[转载] From: http://chl033.woku.com/article/2893317.html 1. 首先一定要注意杂志的发表范围, 超出范围的千万别投,要不就是浪费时 ...

  3. 【HDOJ图论题集】【转】

    =============================以下是最小生成树+并查集====================================== [HDU] How Many Table ...

  4. Python高手之路【六】python基础之字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  5. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

  6. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  7. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  8. 【调侃】IOC前世今生

    前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...

  9. Python高手之路【三】python基础之函数

    基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...

随机推荐

  1. CHAPTER 38 Reading ‘the Book of Life’ The Human Genome Project 第38章 阅读生命之书 人体基因组计划

    CHAPTER 38 Reading ‘the Book of Life’ The Human Genome Project 第38章 阅读生命之书 人体基因组计划 Humans have about ...

  2. https、ssl、tls协议学习

    一.知识准备 1.ssl协议:通过认证.数字签名确保完整性:使用加密确保私密性:确保客户端和服务器之间的通讯安全 2.tls协议:在SSL的基础上新增了诸多的功能,它们之间协议工作方式一样 3.htt ...

  3. 高可用OpenStack(Queen版)集群-13.分布式存储Ceph

    参考文档: Install-guide:https://docs.openstack.org/install-guide/ OpenStack High Availability Guide:http ...

  4. [BUAA_SE_2017]结对项目-数独程序扩展

    结对项目-数独程序扩展 Runnable on x64 Only sudoku17.txt 须放置在可执行文件同目录中,可移步以下链接进行下载 Core-Github项目地址 GUI-Github项目 ...

  5. iOS开发学习-给圆形图片添加边框

    imageView.layer.cornerRadius = imageView.bounds.size.width * 0.5;// 设置圆角刚好是自身宽度的一半,就刚好是圆形 imageView. ...

  6. Hibernate笔记①--myeclipse制动配置hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任何使用JD ...

  7. OTCL,面向对象的脚本一

    Otcl 简介 面向对象的脚本语言 类变量和类方法 Otcl的基类称为Object(类的名字,不是面向对象中的"对象"),所以的Otcl类都是从Object派送来的. 直接贴代码, ...

  8. 【CS231N】5、神经网络静态部分:数据预处理等

    一.疑问 二.知识点 1. 白化 ​ 白化操作的输入是特征基准上的数据,然后对每个维度除以其特征值来对数值范围进行归一化.该变换的几何解释是:如果数据服从多变量的高斯分布,那么经过白化后,数据的分布将 ...

  9. python learning OOP2.py

    class Student(object): pass s = Student() s.name = 'Chang' # 给一个实例动态绑定一个属性 print(s.name) def set_age ...

  10. JAVA 构造函数 静态变量

    class HelloA { public HelloA() { System.out.println("HelloA"); } { System.out.println(&quo ...