社区讨论

AC代码(非本人)

P7915[CSP-S 2021] 回文参与者 5已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@lobhbaqq
此快照首次捕获于
2023/10/29 21:00
2 年前
此快照最后确认于
2023/11/04 02:17
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
const int N=1e6+10;
inline int read(){
	int f=1, x=0; char ch=getchar();
	while(!isdigit(ch)) { if(ch=='-') f=-1; ch=getchar(); }
	while(isdigit(ch)) { x=x*10+ch-48; ch=getchar(); }
	return f*x;
}
int T, a[N], num[N], to[N], n;
int vis[N];
int stk[N], l, r;
bool dfs(int k){
	if(k==n+1) return 1;
	bool flag=0;
	if((vis[to[l]+1]||vis[to[l]-1]||k==1)&&!vis[l]){
		vis[to[l]]=k; ++l; stk[k]=1;
		flag|=dfs(k+1); --l; vis[to[l]]=0;
	}
	if(flag) return 1;
	if((vis[to[r]+1]||vis[to[r]-1]||k==1)&&!vis[r]){
		vis[to[r]]=k; --r; stk[k]=2;
		flag|=dfs(k+1); ++r; vis[to[r]]=0;
	}
	return flag;
}
signed main(void){

	T=read();
	while(T--){
		n=read(); l=1, r=n<<1;
		memset(vis, 0, sizeof vis);
		memset(num, 0, sizeof num);
		memset(stk, 0, sizeof stk);
		memset(to, 0, sizeof to);
		for(int i=1; i<=n<<1; ++i) a[i]=read();
		for(int i=1; i<=n<<1; ++i){
			if(!num[a[i]]) num[a[i]]=i;
			else to[i]=num[a[i]], to[num[a[i]]]=i;
		}
		bool flag=dfs(1);
		if(!flag) { puts("-1"); continue; }
		l=1, r=n<<1;
		for(int i=1; i<=n; ++i){
			stk[i]==1 ? printf("L") : printf("R");
			if(stk[i]==1) vis[to[l++]]=i;
			else vis[to[r--]]=i;
		}
		while(l<=r){
			if(vis[l]>=vis[r]) printf("L"), ++l;
			else printf("R"), --r;
		}
		puts("");
	}
	return 0;
}

回复

5 条回复,欢迎继续交流。

正在加载回复...