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

题意

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

Solution

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

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

细节

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

代码

  1. // hdu4285
  2. #include<algorithm>
  3. #include<iostream>
  4. #include<cstdlib>
  5. #include<cstring>
  6. #include<cstdio>
  7. #include<cmath>
  8. #include<queue>
  9. #define LL long long
  10. #define HAS 300007
  11. #define MOD 1000000007
  12. #define inf 2147483640
  13. #define Pi acos(-1.0)
  14. #define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
  15. using namespace std;
  16.  
  17. const int maxh=300010,maxs=1000010,maxd=15;
  18. int a[maxd][maxd],code[maxd],cnts[maxd],n,m,K;
  19. int size[2],tot[2][maxs],num;
  20. int nxt[maxs],head[maxh];
  21. LL s[2][maxs];
  22. char ch[maxd];
  23.  
  24. void decode(LL st) {
  25. num=st&63,st>>=6;
  26. for (int i=m;i>=0;i--) code[i]=st&7,st>>=3;
  27. }
  28. LL encode(int op,int m) {
  29. int cnt=0;LL st=0;
  30. if (op) {
  31. memset(cnts,-1,sizeof(cnts));cnts[0]=0;
  32. for (int i=0;i<=m;i++) {
  33. if (cnts[code[i]]==-1) cnts[code[i]]=++cnt;
  34. code[i]=cnts[code[i]];
  35. }
  36. }
  37. for (int i=0;i<=m;i++) st=st<<3|code[i];
  38. return st<<6|num;
  39. }
  40. void add(LL tmp,int p,int num) {
  41. int id=tmp%HAS;
  42. for (int i=head[id];i;i=nxt[i])
  43. if (s[p][i]==tmp) {(tot[p][i]+=num)%=MOD;return;}
  44. s[p][++size[p]]=tmp;tot[p][size[p]]=num;
  45. nxt[size[p]]=head[id];head[id]=size[p];
  46. }
  47. void shift() {
  48. for (int i=m;i;i--) code[i]=code[i-1];code[0]=0;
  49. }
  50. int main() {
  51. int T;scanf("%d",&T);
  52. while (T--) {
  53. memset(a,0,sizeof(a));
  54. scanf("%d%d%d",&n,&m,&K);
  55. for (int i=1;i<=n;i++) {
  56. scanf("%s",ch+1);
  57. for (int j=1;j<=m;j++) a[i][j]=ch[j]=='.';
  58. }
  59. int p=0;
  60. size[p]=1;tot[p][1]=1;s[p][1]=0;
  61. for (int i=1;i<=n;i++)
  62. for (int j=1;j<=m;j++) {
  63. size[p^=1]=0;
  64. memset(head,0,sizeof(head));
  65. for (int k=1;k<=size[p^1];k++) {
  66. decode(s[p^1][k]);
  67. int left=code[j-1],up=code[j];
  68. if (!a[i][j]) {
  69. code[j-1]=code[j]=0;
  70. //if (j==m) shift();
  71. add(encode(0,j==m ? m-1 : m),p,tot[p^1][k]);
  72. continue;
  73. }
  74. if (left && up) {
  75. if (left==up) {
  76. if (num>=K) continue;
  77. int tmp=0;
  78. for (int l=j+1;l<=m;l++) if (code[l]) tmp++;
  79. if (tmp&1) continue;
  80. num++;code[j-1]=code[j]=0;
  81. //if (j==m) shift();
  82. add(encode(0,j==m ? m-1 : m),p,tot[p^1][k]);
  83. }
  84. else {
  85. for (int l=0;l<=m;l++) if (code[l]==left) code[l]=up;
  86. code[j-1]=code[j]=0;
  87. //if (j==m) shift();
  88. add(encode(1,j==m ? m-1 : m),p,tot[p^1][k]);
  89. }
  90. }
  91. else if (left || up) {
  92. int tmp=left ? left : up;
  93. if (a[i][j+1]) {
  94. code[j-1]=0,code[j]=tmp;
  95. add(encode(0,j==m ? m-1 : m),p,tot[p^1][k]);
  96. }
  97. if (a[i+1][j]) {
  98. code[j-1]=tmp,code[j]=0;
  99. //if (j==m) shift();
  100. add(encode(0,j==m ? m-1 : m),p,tot[p^1][k]);
  101. }
  102. }
  103. else {
  104. if (a[i][j+1] && a[i+1][j]) {
  105. code[j-1]=code[j]=13;
  106. add(encode(1,j==m ? m-1 : m),p,tot[p^1][k]);
  107. }
  108. }
  109. }
  110. }
  111. int ans=0;
  112. for (int i=1;i<=size[p];i++)
  113. if ((s[p][i]&63)==K) (ans+=tot[p][i])%=MOD;
  114. printf("%d\n",ans);
  115. }
  116. return 0;
  117. }

【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. 4. 为HelloWorld添加日志

    回顾 通过上篇内容,我们已经使用flask编写了我们的第一个接口或者说是html页面.我们可以看到,使用flask来编写接口/页面是十分简单的.那么接下来,我们丰富一下上面的例子. 需求 现在的需求来 ...

  2. C++STL 中的容器整体/逐元素操作方法 少写80%for循环

    本文中示例代码默认已引用 std 命名空间 累加 (std::accumulate) accumulate(begin, end, init, op) 返回给定区间内元素的累加值与给定初值的和,初值不 ...

  3. PHP XXE漏洞

    PHP xml 外部实体注入漏洞(XXE) 1.环境 PHP 7.0.30Libxml 2.8.0Libxml2.9.0 以后 ,默认不解析外部实体,对于PHP版本不影响XXE的利用 2.原理介绍 X ...

  4. JDK8 metaspace调优

    从JDK8开始,永久代(PermGen)的概念被废弃掉了,取而代之的是一个称为Metaspace的存储空间.Metaspace使用的是本地内存,而不是堆内存,也就是说在默认情况下Metaspace的大 ...

  5. Leetcode题库——5.最长回文子串

    @author: ZZQ @software: PyCharm @file: longestPalindrome.py @time: 2018/9/18 20:06 要求:给定一个字符串 s,找到 s ...

  6. 【搜索】POJ-3009 DFS+回溯

    一.题目 Description On Planet MM-21, after their Olympic games this year, curling is getting popular. B ...

  7. mvc拦截请求IHttpModule

    代码: using System; using System.Collections.Generic; using System.Linq; using System.Web; using Syste ...

  8. Ubuntu16.04 下虚拟环境的创建与使用

    1. 虚拟环境   虚拟环境(virtual environment),顾名思义是虚拟出来的环境,通俗来讲,可以借助虚拟机,docker来理解虚拟环境,就是把一部分内容独立出来,我们把这部分独立出来的 ...

  9. typedef struct bit0 : 1

    这句话定义了一个位域,bit0是该位域的域名,而且bit0只占用一个位.位域是指信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.为了节省存储空间,并使处理简便,C语言提供了一种 ...

  10. Beta阶段团队项目开发篇章4

    例会时间 2016.12.11 例会照片 个人工作 上阶段任务验收 删除robot功能较为简单,基本实现,但是一直Question版块任务量过大,考虑到最近要进行编译课设第二次测试,为该任务再分配一段 ...