题目:【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");
}
}