题意:
有一条长度为m的01串(首尾相连),已知其中连续的长度为k的m个01串互不相同,求出m的最大值和字典序最小的01串。
做法:
将k位二进制数当做点,将k+1位二进制数当做边,发现该图为欧拉图,
m=2k
m
=
2
k
;
第二问由于是欧拉图,直接大暴力很快就能搜出答案?qaq….
(猜结论好题。。(大雾)
代码:
/*************************************************************
Problem: bzoj 3033 太鼓达人
User: fengyuan
Language: C++
Result: Accepted
Time: 4 ms
Memory: 1336 kb
Submit_Time: 2018-01-24 12:31:53
*************************************************************/
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cctype>
#include<cstdlib>
#include<cmath>
using namespace std;
typedef long long ll;
inline ll read() {
char ch = getchar(); ll x = 0; int op = 1;
for(; !isdigit(ch); ch = getchar()) if(ch == '-') op = -1;
for(; isdigit(ch); ch = getchar()) x = x*10+ch-'0';
return x*op;
}
inline void write(ll a) {
if(a < 0) putchar('-'), a = -a;
if(a >= 10) write(a/10); putchar('0'+a%10);
}
int n, t, ans[5000], vis[5000];
inline void dfs(int x, int k) {
if(k == t) {
for(int i = 1; i <= t-n+1; i ++) printf("%d", ans[i]);
exit(0);
}
vis[x] = 1; ans[k] = x&1;
if(!vis[(x<<1)&(t-1)]) dfs((x<<1)&(t-1), k+1);
if(!vis[(x<<1|1)&(t-1)]) dfs((x<<1|1)&(t-1), k+1);
vis[x] = 0;
}
int main() {
n = read();
write(t = (1<<n)); putchar(' ');
for(int i = 1; i < n; i ++) putchar('0');
dfs(0, 1);
}