一个普普通通的求助帖
  • 板块学术版
  • 楼主langley314
  • 当前回复9
  • 已保存回复9
  • 发布时间2021/11/17 21:12
  • 上次更新2023/11/4 00:18:13
查看原帖
一个普普通通的求助帖
549686
langley314楼主2021/11/17 21:12

题目:【21CSPS提高组】回文(palin) 这是我的代码,样例过了,但是交上去只过了两个点(非前两个)```cpp #include<bits/stdc++.h> #define NN 1000011 #define N 500005 using namespace std; int i,n,a[NN],Po[NN];//Po该位置的值的另一个所在位置 int T,L,R,b[N];//b辅助Po记录 bool B[NN];//是否被"用过" int H[N],Ans[NN];//H记录第i个数为哪个值;Ans记录答案,L 76,R 82
inline bool f(int u)//第u位 { if(u<=n){ int pos=Po[L];//检查左端 if(B[L]==false && B[pos+1]==true || B[pos-1]==true || u==1) { B[pos]=true; H[u]=a[L++];//记录第u位值 Ans[u]=76; if(f(u+1)==true) return true;//找到方案则返回 B[pos]=false; L--;//未找到方案则回溯 } pos=Po[R];//检查右端 if(B[R]==false && B[pos+1]==true || B[pos-1]==true || u==1) { B[pos]=true; H[u]=a[R--];//记录第u位值 Ans[u]=82; if(f(u+1)==true) return true;//找到方案则返回 B[pos]=false; R++;//未找到方案则回溯 } return false;//左右都不行,则返回false } return true; } inline void Clear() { memset(B,false,sizeof(B)); memset(b,0,sizeof(b)); } int main() { cin>>T; while(T--) { Clear(); scanf("%d",&n); L=1,R=2n; for(i=1; i<=2n; i++) { scanf("%d",&a[i]); b[a[i]]==0 ? b[a[i]]=i : Po[i]=b[a[i]],Po[b[a[i]]]=i; } if(f(1)==false) printf("-1"); else{ for(i=1;i<=n;i++) if(a[L]==H[n-i+1]) Ans[n+i]=76; else Ans[n+i]=82; for(i=1;i<=2*n;i++) printf("%c",Ans[i]); } printf("\n"); } }

2021/11/17 21:12
加载中...