代码:
//P7915
#include <cstdio>
using namespace std;
const int N = 1000005;
int T, n, a[N], p1, p2, len;
char ans[N];
/*
struct Function_print{
int tab, step;
void pt(){
for (int i = 1; i <= tab; i++){
for (int j = 1; j <= step; j++){
printf(" ");
}
}
return;
}
void push(int l1, int r1, int l2, int r2, int p){
for (int i = 1; i <= tab; i++){
for (int j = 1; j <= step; j++){
printf(" ");
}
}
printf("dfs(%d, %d, %d, %d, %d){\n", l1, r1, l2, r2, p);
tab++;
return;
}
void pop(bool res){
for (int i = 1; i <= tab; i++){
for (int j = 1; j <= step; j++){
printf(" ");
}
}
printf("return %d;\n", res);
tab--;
for (int i = 1; i <= tab; i++){
for (int j = 1; j <= step; j++){
printf(" ");
}
}
printf("}\n");
return;
}
void newstep(int ns){
step = ns;
return;
}
void clear(){
tab = 0;
return;
}
}Dfs;
*/
bool dfs(int l1, int r1, int l2, int r2, int p){
// Dfs.push(l1, r1, l2, r2, p);
if (l1 > r1 && l2 > r2){
// Dfs.pt();
for (int i = 1; i <= 2 * n; i++){
printf("%c", ans[i]);
}
printf("\n");
// Dfs.pop(true);
return true;
}
if (a[l1] == a[r1] && l1 < r1){
ans[p] = 'L';
ans[2 * n - p + 1] = 'L';
// Dfs.pt();printf("L L\n");
if (dfs(l1 + 1, r1 - 1, l2, r2, p + 1)){
// Dfs.pop(true);
return true;
}
}
if (a[l1] == a[l2] && l1 <= r1 && l2 <= r2){
ans[p] = 'L';
ans[2 * n - p + 1] = 'R';
// Dfs.pt();printf("L R\n");
if (dfs(l1 + 1, r1, l2 + 1, r2, p + 1)){
// Dfs.pop(true);
return true;
}
}
if (a[r1] == a[r2] && l1 <= r1 && l2 <= r2){
ans[p] = 'R';
ans[2 * n - p + 1] = 'L';
// Dfs.pt();printf("R L\n");
if (dfs(l1, r1 - 1, l2, r2 - 1, p + 1)){
// Dfs.pop(true);
return true;
}
}
if (a[l2] == a[r2] && l2 < r2){
ans[p] = 'R';
ans[2 * n - p + 1] = 'R';
// Dfs.pt();printf("R R\n");
if (dfs(l1, r1, l2 + 1, r2 - 1, p + 1)){
// Dfs.pop(true);
return true;
}
}
// Dfs.pop(false);
return false;
}
int main(){
// freopen("input.in", "r", stdin);
scanf("%d", &T);
while (T--){
// Dfs.clear();
// Dfs.newstep(4);
scanf("%d", &n);
for (int i = 1; i <= 2 * n; i++){
scanf("%d", &a[i]);
}
for (int i = 2; i <= 2 * n; i++){
if (a[i] == a[1]){
p1 = i;
break;
}
}
for (int i = 1; i < 2 * n; i++){
if (a[i] == a[2 * n]){
p2 = i;
break;
}
}
ans[1] = 'L';
ans[2 * n] = 'L';
if (!dfs(2, p1 - 1, p1 + 1, 2 * n, 2)){
ans[1] = 'R';
if (!dfs(1, p2 - 1, p2 + 1, 2 * n - 1, 2)){
printf("-1\n");
}
}
for (int i = 1; i <= 2 * n; i++){
ans[i] = ' ';
}
}
return 0;
}
解除注释可以显示dfs的递归过程。
第11个点的数据见剪切板
奆佬们,知道蒟蒻错哪了请@蒟蒻,不然蒟蒻可能看不到QAQ。