传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1080

神暴力,待搞懂.

代码

  1. #include <cstdio>
  2. #include <cmath>
  3. #include <iostream>
  4. #include <cstring>
  5. #include <algorithm>
  6. #include <vector>
  7. #include <map>
  8. #include <queue>
  9. #define ll long long
  10. using namespace std;
  11. typedef vector<int> ve;
  12. map <ve,int> hash;
  13. queue<ve>q;
  14. string s[35];
  15. int n;
  16. void work()
  17. {
  18. ve u,v,t;
  19. for (int i=1;i<=n;i++)
  20. if (s[i]=="")
  21. {
  22. printf("0");
  23. exit(0);
  24. }
  25. else u.push_back(i<<6);
  26. hash[u]=0;
  27. for(q.push(u);!q.empty();)
  28. {
  29. u=q.front();
  30. q.pop();
  31. int x=hash[u],cnt;
  32. for (int ch='0';ch<='1';ch++)
  33. {
  34. cnt=0;
  35. v.clear();
  36. for (int i=0;i<u.size();i++)
  37. {
  38. int which=u[i]>>6,where=u[i]&63;
  39. if (s[which][where]^ch) continue;
  40. if(++where==s[which].size()) {
  41. ++cnt;
  42. for (int j=1;j<=n;j++)v.push_back(j << 6);
  43. }else v.push_back(which<<6|where);
  44. }
  45. if(cnt>=3)
  46. {
  47. printf("%d",x+1);
  48. exit(0);
  49. }
  50. sort(v.begin(),v.end());
  51. t.clear();
  52. for (int i=0;i<v.size();i++)
  53. {
  54. if(i<3||v[i]^v[i-3]) t.push_back(v[i]);
  55. }
  56. int &th=hash[t];
  57. if (t.size()&&!th) th=x+1,q.push(t);
  58. }
  59. }
  60. printf("-1");
  61. }
  62. int main()
  63. {
  64. scanf("%d",&n);
  65. for (int i=1;i<=n;i++) cin>>s[i];
  66. work();
  67. return 0;
  68. }

bzoj1080的更多相关文章

  1. BZOJ1080 暴力+位移运算符的用法

    1080: [SCOI2008]劣质编码 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 337  Solved: 148[Submit][Status ...

  2. BZOJ第1页养成计划

    嗯,用这篇博客当一个目录,方便自己和学弟(妹?)们查阅.不定期更新. BZOJ1000   BZOJ1001   BZOJ1002   BZOJ1003   BZOJ1004   BZOJ1005   ...

随机推荐

  1. 一步一步来做WebQQ机器人-(五)(发送消息||完结)

    × 本篇主要是: 发送QQ消息(to:好友,群),以及对小黄鸡抓包利用它的语言库 本文是WebQQ流程的最后一章 最后一章内容不多但我还是啰嗦,可能对大部分人都已知晓的流程方法我也会介绍一下 前面几个 ...

  2. python零碎知识点一

    dir(object),列出对象所有可以用的的方法(参数可以为任意对象,例如class,func等) >>>dir('str') ['__add__', '__class__', ' ...

  3. Spark1.6.2 java实现读取json数据文件插入MySql数据库

    public class Main implements Serializable { /** * */ private static final long serialVersionUID = -8 ...

  4. AngularJS基础知识1

    一.angularJS简介 1.什么是 AngularJS? AngularJS 是一个 JavaScript 框架.它是一个以 JavaScript 编写的库.AngularJS是协助搭建单页面工程 ...

  5. Java中的Atomic包使用指南

    Atomic包介绍 在Atomic包里一共有12个类,四种原子更新方式,分别是原子更新基本类型,原子更新数组,原子更新引用和原子更新字段.Atomic包里的类基本都是使用Unsafe实现的包装类. 原 ...

  6. CentOS下 pycharm开发环境搭建

    经过一系统列的折腾之后,我终于有高版本的python和我熟悉的输入法用了,下面来搭建pycharm下的python开发环境. 1.首先安装java jdk注意是JAVA 的JDK,不是JAVA VM什 ...

  7. servlet的匹配规则,兼谈/与/*

    客户端通过URL地址访问服务器(servlet容器)资源,所以servlet若要能对外提供服务,必须要将程序按照java规范将其映射到对应的URL上,映射的规则是需要开发人员在WEB.XML中显示指定 ...

  8. Python基础-字符编码与转码

    ***了解计算机的底层原理*** Python全栈开发之Python基础-字符编码与转码 需知: 1.在python2默认编码是ASCII, python3里默认是utf-8 2.unicode 分为 ...

  9. VSO-Branch和Merge

    分支策略 一般采用一个MAIN分支,一个或多个DEVELOPMENT分支的分支结构,如下图(来自:https://msdn.microsoft.com/en-us/library/ee782536.a ...

  10. Linux -- objdump二进制文件比较

    objdump工具用来显示二进制文件的信息,就是以一种可阅读的格式让你更多地了解二进制文件可能带有的附加信息. 常用参数说明 -f 显示文件头信息 -D 反汇编所有section (-d反汇编特定se ...