题目描述 Description

  七夕祭上,Vani牵着cl的手,在明亮的灯光和欢乐的气氛中愉快地穿行。这时,在前面忽然出现了一台太鼓达人机台,而在机台前坐着的是刚刚被精英队伍成员XLk、Poet_shy和lydrainbowcat拯救出来的的applepi。看到两人对太鼓达人产生了兴趣,applepi果断闪人,于是cl拿起鼓棒准备挑战。然而即使是在普通难度下,cl的路人本性也充分地暴露了出来。一曲终了,不但没有过关,就连鼓都不灵了。Vani十分过意不去,决定帮助工作人员修鼓。

  鼓的主要元件是M个围成一圈的传感器。每个传感器都有开和关两种工作状态,分别用1和0表示。显然,从不同的位置出发沿顺时针方向连续检查K个传感器可以得到M个长度为K的01串。Vani知道这M个01串应该是互不相同的。而且鼓的设计很精密,M会取到可能的最大值。现在Vani已经了解到了K的值,他希望你求出M的值,并给出字典序最小的传感器排布方案。

输入描述 Input Description

  一个整数K。

输出描述 Output Description

  一个整数M和一个二进制串,由一个空格分隔。表示可能的最大的M,以及字典序最小的排布方案,字符0表示关,1表示开。你输出的串的第一个字和最后一个字是相邻的。

样例输入 Sample Input

3

样例输出 Sample Output

8 00010111

数据范围及提示 Data Size & Hint

样例说明 
  得到的8个01串分别是000、001、010、101、011、111、110和100。注意前后是相邻的。长度为3的二进制串总共只有8种,所以M = 8一定是可能的最大值。

数据范围与约定 
  对于全部测试点,2≤K≤11。

思路:

1、首先考虑m的问题,如果一个数K确定了,那么在1-k个位置,都有0或1进行组合,所组合出来的情况数正好是2^k,所以直接让 m 为 2^k

2、从一开始进行搜索,每个位置两种可能的情况0或1,如果搜索到大于等于k的位置了,就把前k长的01串记录下来,在扩展节点的时候,如果填入下一个位置后,出现的子01串已经出现过,就不要再往下扩展,这个记录可以用hash表来实现

3、如果已经搜到了最后一个位置,就将后i个01串,和前k-i个01串拼接起来,如果这些串都没有出现过,就记录当前串为答案,返回true,输出答案

代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<string>
  6. #include<cmath>
  7. using namespace std;
  8. int k,m;
  9. bool hashmap[];
  10. string ans;
  11. int gethash(string s){
  12. int size = s.size();
  13. int ret = ,val = ;
  14. for(int i = size - ;i >= ;i--){
  15. val += (s[i] - '' + ) * ret;
  16. ret *= ;
  17. }
  18. return val;
  19. }
  20. string getsub(string a){
  21. int size = a.size();
  22. if(size < k) return a;
  23. if(size >= k) return a.substr(size - k,k);
  24. }
  25. bool dfs(int deep,string a){
  26. if(deep == m){
  27. string last,head,sum;
  28. int j;
  29. for(int i = ;i < k;i++){
  30. j = m - k + i;
  31. last = a.substr(j,k-i);
  32. head = a.substr(,i);
  33. sum = last + head;
  34. if(hashmap[gethash(sum)]) return false;
  35. }
  36. ans = a;
  37. return true;
  38. }
  39. char c;
  40. string now = a;
  41. int nval = gethash(getsub(a)),pval;
  42. if(deep >= k && hashmap[nval]) return false;
  43. if(deep >= k)hashmap[nval] = ;
  44. now += '';
  45. for(int i = ;i <= ;i++){
  46. if(i == ) now[deep] = '';
  47. else now[deep] = '';
  48. pval = gethash(getsub(now));
  49. if(hashmap[pval]) continue;
  50. if(dfs(deep + ,now)) return true;
  51. }
  52. hashmap[nval] = ;
  53. return false;
  54. }
  55. int main(){
  56. cin>>k;
  57. m = pow(,k);
  58. string start = "";
  59. dfs(,start);
  60. cout<<m<<" "<<ans<<endl;
  61. return ;
  62. }

codevs2486 太鼓达人的更多相关文章

  1. Silverlight 手鼓达人-仿太鼓达人 开源

    Silverlight 手鼓达人-仿太鼓达人 介绍  手鼓达人是本人2012年中silverlight最火的一段时间开发的,本来目的只是想研究一下silverlight做游戏和做应用有何不同,但是后面 ...

  2. 【BZOJ-3033】太鼓达人 欧拉图 + 暴搜

    3033: 太鼓达人 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 204  Solved: 154[Submit][Status][Discuss] ...

  3. bzoj 3033: 太鼓达人 [欧拉回路]

    3033: 太鼓达人 题意:长m的01环,每个长k的子串都是不同的01串.给出k,求最大的M以及字典序最小的方案. \(M=2^k\) 可以把k-1位01串看成点,k位01串就是边,满足欧拉回路的条件 ...

  4. BZOJ3033太鼓达人——哈密顿回路/欧拉回路

    题目描述 七夕祭上,Vani牵着cl的手,在明亮的灯光和欢乐的气氛中愉快地穿行.这时,在前面忽然出现了一台太鼓达人机台,而在机台前坐着的是刚刚被精英队伍成员XLk.Poet_shy和lydrainbo ...

  5. bzoj3033: 太鼓达人 欧拉路径

    题目链接 bzoj3033: 太鼓达人 题解 对于k-1位点,k位二进制位边,将点的转移连起来 每个点的入度和出度相等并且全部是偶点 只需要在这个图中找字典序最小的欧拉回路 可以贪心地找字典序较小的边 ...

  6. 【刷题】BZOJ 3033 太鼓达人

    Description 七夕祭上,Vani牵着cl的手,在明亮的灯光和欢乐的气氛中愉快地穿行.这时,在前面忽然出现了一台太鼓达人机台,而在机台前坐着的是刚刚被精英队伍成员XLk.Poet_shy和ly ...

  7. BZOJ3033: 太鼓达人(欧拉回路)

    Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 524  Solved: 400[Submit][Status][Discuss] Description ...

  8. 【BZOJ3033】太鼓达人 暴力+欧拉回路

    [BZOJ3033]太鼓达人 Description 七夕祭上,Vani牵着cl的手,在明亮的灯光和欢乐的气氛中愉快地穿行.这时,在前面忽然出现了一台太鼓达人机台,而在机台前坐着的是刚刚被精英队伍成员 ...

  9. BZOJ3033:太鼓达人(DFS,欧拉图)

    Description 七夕祭上,Vani牵着cl的手,在明亮的灯光和欢乐的气氛中愉快地穿行.这时,在前面忽然出现了一台太鼓达人机台,而在机台前坐着的是刚刚被精英队伍成员XLk.Poet_shy和ly ...

随机推荐

  1. spring的annotation

    spring容器创建bean对象的方式: 1,使用反射调用无参构造器来创建实例(前提是这个类有无参构造器)(常规方式) 2,通过工厂类获得实例(工厂类实现了接口FactoryBean<?> ...

  2. 【第三届强网杯】write up

    一,鲲or鳗orGame 从浏览器里拿到game.gb 用 VisualBoyAdvance ,搜索内存变量,然后改变量就完事了,但是改变量他们说直接利用添加代码功能有bug,所以要在工具里的内存查看 ...

  3. 二分图判定+点染色/并查集 BestCoder Round #48 ($) 1002 wyh2000 and pupil

    题目传送门 /* 二分图判定+点染色:因为有很多联通块,要对所有点二分图匹配,若不能,存在点是无法分配的,no 每一次二分图匹配时,将点多的集合加大最后第一个集合去 注意:n <= 1,no,两 ...

  4. I - Andy's First Dictionary(set+stringstream)

    Description Andy, 8, has a dream - he wants to produce his very own dictionary. This is not an easy ...

  5. 275 H-Index II H指数 II

    这是 H指数 进阶问题:如果citations 是升序的会怎样?你可以优化你的算法吗? 详见:https://leetcode.com/problems/h-index-ii/description/ ...

  6. 设计模式学习之代理模式(Proxy)

    一.代理模式的初衷 不想让客户端直接访问具体实现接口,客户端不应该直接访问具体实现,一般会涉及到以下四个对象 业务接口:定义客户端访问的接口,是实现类和代理类都需要实现的 实现类:实现了业务接口,真正 ...

  7. request获取请求参数

    /** * 方式1 */ Enumeration<?> enu=request.getParameterNames(); while(enu.hasMoreElements()){ Str ...

  8. arp学习笔记(linux高性能服务编程)

    先看看arp的定义吧 现在linux运行这条命令 tcpdump -i eth0:1 -ent '(dst 192.168.5.190 and src 192.168.5.109)or( dst 19 ...

  9. 【原创】利用doxygen来管理项目文档或注释

    一.doxygen应用场景: doxygen可以用来管理目前主流的编程语言的注释而形成文档系统.(包括C, C++, C#, Objective-C, IDL, Java, VHDL, PHP, Py ...

  10. 2057. [ZLXOI2015]殉国

    ★☆   输入文件:BlackHawk.in   输出文件:BlackHawk.out   评测插件 时间限制:0.05 s   内存限制:256 MB [题目描述] 正义的萌军瞄准了位于南极洲的心灵 ...