题解:P10950 太鼓达人
分析
显然答案包含长度为
因此该串的长度为所有
考虑第二个如何解决。
发现每个位置的状态只有
显然直接搜的复杂度为
考虑剪枝,如果搜索中当前的串不符合条件,那么直接返回。
这样就能通过本题。
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 中国大陆许可协议进行许可。
分类:
题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步