题解:P10950 太鼓达人

分析

显然答案包含长度为 K 的所有 01 串,每个串和前一个的重叠长度为 K1,所以每个串对长度的贡献为 1

因此该串的长度为所有 01 串的个数,即 2K


考虑第二个如何解决。

发现每个位置的状态只有 01,考虑爆搜。

显然直接搜的复杂度为 O(22K),不能通过本题。

考虑剪枝,如果搜索中当前的串不符合条件,那么直接返回。

这样就能通过本题。

Code

#include<bits/stdc++.h>
using namespace std;
#define maxn 100005
string ans, tmp;
bool vis[1<<12];
int to_int(string s)
{
int ret=0;
for(auto c:s) ret=(ret<<1)|(c^48);
return ret;
}
bool chk(int k)
{
tmp=ans+ans;
int n=ans.size();
memset(vis, 0, sizeof vis);
for(int i=0;i<n;i++)
{
int r=to_int(tmp.substr(i, k));
if(vis[r]) return 0;
vis[r]=1;
}
return 1;
}
bool chk1(int k)
{
tmp=ans;
int n=ans.size();
memset(vis, 0, sizeof vis);
for(int i=0;i<n-k;i++)
{
int r=to_int(tmp.substr(i, k));
if(vis[r]) return 0;
vis[r]=1;
}
return 1;
}
void dfs(int p, int k)
{
if(!chk1(k)) return;
if(p==(1<<k))
{
if(chk(k)) cout<<ans, exit(0);
return;
}
ans+='0';
dfs(p+1, k);
ans.pop_back();
ans+='1';
dfs(p+1, k);
ans.pop_back();
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int k;
cin>>k;
cout<<(1<<k)<<' ';
dfs(0, k);
}

本文作者:Jimmy-LEEE

本文链接:https://www.cnblogs.com/redacted-area/p/18429457

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Jimmy-LEEE  阅读(8)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起