题解:P11008 『STA - R7』异或生成序列
Solution
序列
由
坚信深搜过百万的蒟蒻。。。
原
{
}
将其前面插入一个元素
{
}
若
xor
当
此时有一个浅显的可行性剪枝,因为
= 或
因此可以一边输入
(这实际上把一部分不可行搜索给提前筛掉,剩下的不可行搜索仍继续判断并剪枝,这样便能大大降低复杂度,将那些把搜索代码卡到趋近
综上,我们便完成(水过)了这一题。
Code
#include<bits/stdc++.h>
using namespace std;
const int N=2e6+1;
int t,n,fl,b[N],p[N],mp[N],sum;
//mp存是否填过该数字
unordered_map<int,int> vis;
//vis存可行性,true表示不可行,map的初始化比数组稍快亿点点,不用TLE
void dfs(int x,int dep){
if(x<1||x>n||mp[x])return;//可行性剪枝,当P[i]大于n 或 小于1 或 数字重复时不可行
if(dep==n){//可行
for(int i=1;i<n;++i)printf("%d ",p[i]);//输出答案
printf("%d\n",x);
fl=0;//已经输出答案,打上标记避免再次搜索
return;
}
p[dep]=x;
//搜索回溯
++mp[x];
dfs(b[dep]^x,dep+1);
--mp[x];
}
int main() {
scanf("%d",&t);
while(t--){
scanf("%d",&n);
vis.clear();//初始化
fl=1,sum=0;
for(int i=1;i<n;++i){
scanf("%d",b+i);
sum^=b[i];//做异或前缀和
++vis[sum];//剪枝:第一个数字的选择中筛掉0^sum即sum(序列p中仅有1~n,没有0)
// ++vis[(n+1)^sum]; 剪枝:第一个数字的选择中筛掉(n+1)^sum(序列p中仅有1~n,没有n+1)
// 做其中一个剪枝就行,两个剪枝一起做速度更慢
}
for(int i=1;i<=n;++i){
if(!fl) break;//如果可行
if(!vis[i]) dfs(i,1);//如果且尚未输出答案,搜索第一个数为i的情况
}
}
return 0;
}
快读压行代码
加了快读的代码(
#include<bits/stdc++.h>
using namespace std;
#define to(x,y) for(int x=1;x<=y;++x)
#define fr(x,y) for(int x=0;x<y;++x)
inline void wrt(int x) {if (x < 0) {x = -x;putchar('-');}if (x > 9) wrt(x / 10);putchar(x % 10 + '0');}
inline int read(){int x=0,f=1;char ch=getchar();while(ch<48||ch>57){if(ch=='-')f=-1;ch=getchar();}while(ch>=48&&ch<=57)x=x*10+ch-48,ch=getchar();return x*f;}
const int N=2e6+1;
int t,n,fl,b[N],p[N],mp[N],sum;
unordered_map<int,int> vis;
void dfs(int x,int dep){
if(x==0||x>n||mp[x])return;
if(dep==n){
to(i,n-1)wrt(p[i]),putchar(' ');
wrt(x),putchar('\n');
fl=0;
return;
}
p[dep]=x,++mp[x];
dfs(b[dep]^x,dep+1);
--mp[x];
}
int main() {
for(t=read();t--;){
vis.clear();
n=read();
fl=1;sum=0;
to (i,n - 1)b[i]=read(),sum^=b[i],++vis[sum];
to(i,n){
if(!fl)break;
if(!vis[i]){
dfs(i,1);
}
}
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架