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. 高级PHP工程师所应该具备的专业素养

    初次接触PHP,就为他的美所折服,于是一发不可收拾. 很多面试,很多人员能力要求都有“PHP高级工程师的字眼”,如果您真心喜欢PHP,并且您刚起步,那么我简单说说一个PHP高级工程师所应该具备的,希望 ...

  2. oracle数据库更改字符集

    在数据迁徙的时候需要使源和目标数据库的字符集.版本等信息统一…… 这里是对一个数据库的设置,需要在两边进行同样的操作. SYS@PROD1> select userenv('language') ...

  3. 3星|《实战复盘第四季·商业巨头们的变革之道》:GE、TCL、力拓集团、英美资源集团等企业总裁的变更经验

    实战复盘第四季·商业巨头们的变革之道(<哈佛商业评论>增刊) 本期是<哈佛商业评论>“实战复盘”栏目的10篇文章,讲的是GE.TCL.力拓集团.英美资源集团等企业如何熬过变革期 ...

  4. 【坚持】Selenium+Python学习之从读懂代码开始 DAY4

    2018/05/21 [生成器详解:廖雪峰的官方网站](https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d ...

  5. RabbitMQ和Kafka,更加便捷高效的消息队列使用方式,请放心食用

    一.RabbitMQ实例介绍RabbitMQ实例由华为云分布式消息服务(DMS)团队打造,实例采用物理隔离的方式部署,租户独占RabbitMQ实例.一键式部署,完全兼容开源RabbitMQ的使用方式, ...

  6. 导出excel失败,提示提示加载类型库/DDL出错

    首先,这里提供的解决办法仅适用于出现如下异常的情况:无法将类型为“Microsoft.Office.Interop.Excel.ApplicationClass”的 COM 对象强制转换为接口类型“M ...

  7. “Hello World!”团队第六周第七次会议

    博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.todo list 六.会议照片 七.燃尽图 八.checkout&push代码 一.会议时间 2017年11月23日  ...

  8. 记事本App之NABCD

    在经过了漫长的讨论之后,在经历了无数次提议.否定.再提议.改进之后.我们团队的团队项目终于有了结果,小组成员一致同意做一个移动端记事本的app.下面我就来详细的阐明我们项目的NABCD这5大项内容. ...

  9. OO学习体会与阶段总结(测试与论证)

    前言   随着期末的到来,对于面向对象程序设计课程的学习也迎来了尾声.在最后一个月的从课程中,笔者对于面向对象程序规格实现层面的单元测试.正确性论证以及使用UML图描述程序的设计进行了深入的学习.通过 ...

  10. 针对网站的UI分析

    PM对项目所有功能的把握,特别是UI 最差的UI,体现了团队的组织架构.其次,体现了产品的内部结构.最好,体现了用户的自然需求. 对于几种浏览器分别进行UI分析, (1)360的界面如今看来比较大众化 ...