【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;
}

 

 

posted @ 2017-10-30 16:59  GXZlegend  阅读(244)  评论(1编辑  收藏  举报