【bzoj3033】太鼓达人 DFS欧拉图
题目描述
给出一个整数K,求一个最大的M,使得存在一个每个位置都是0或1的圈,圈上所有连续K位构成的二进制数两两不同。输出最大的M以及这种情况下字典序最小的方案。
输入
一个整数K。
输出
一个整数M和一个二进制串,由一个空格分隔。表示可能的最大的M,以及字典序最小的排布方案,字符0表示关,1表示开。你输出的串的第一个字和最后一个字是相邻的。
样例输入
3
样例输出
8 00010111
题解
DFS欧拉图
简单学了一下深搜欧拉图,感觉复杂度好玄学啊。。
帖一发 黄学长题解
把每个K-1位数看作点,添加1个字符看作边,那么就是求这个图的欧拉回路,直接爆搜即可。
时间复杂度$O(2^k)$
#include <cstdio> int n , m , vis[2050] , ans[2050]; bool dfs(int x , int k) { if(vis[x]) return 0; if(k == m) return 1; ans[k] = x & 1 , vis[x] = 1; if(dfs((x << 1) & (m - 1) , k + 1)) return 1; if(dfs((x << 1 | 1) & (m - 1) , k + 1)) return 1; vis[x] = 0; return 0; } int main() { int i; scanf("%d" , &n) , m = 1 << n; printf("%d " , m); dfs(0 , 1); for(i = 1 ; i < n ; i ++ ) printf("0"); for(i = 1 ; i <= m - n + 1 ; i ++ ) printf("%d" , ans[i]); printf("\n"); return 0; }