本人不会用string,不知道为什么存操作用string就RE,char数组才AC。求问。 string:
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int n;
int a[N];
int q1[N],h1,t1;
int q2[N],h2,t2;
string op;
bool solve() {
int ix=1;
while(h1<=t1||h2<=t2) {
if(h1<=t1) {
if(h1!=t1&&q1[h1]==q1[t1]) {
ix++;
op[ix]=op[2*n+1-ix]='L';
h1++;t1--;
continue;
}
if(h2<=t2&&q1[t1]==q2[h2]) {
ix++;
op[ix]='L';
op[2*n+1-ix]='R';
t1--;h2++;
continue;
}
}
if(h2<=t2) {
if(h2!=t2&&q2[h2]==q2[t2]) {
ix++;
op[ix]=op[2*n+1-ix]='R';
h2++;t2--;
continue;
}
if(h1<=t1&&q2[t2]==q1[h1]) {
ix++;
op[ix]='R';
op[2*n-ix+1]='L';
t2--;h1++;
continue;
}
}
return 0;
}
return 1;
}
int main() {
int T;
scanf("%d",&T);
while(T--) {
scanf("%d",&n);
for(int i=1;i<=2*n;i++) scanf("%d",&a[i]);
h1=h2=1;t1=t2=0;
for(int i=2;i<=2*n;i++) {
if(a[i]==a[1]) {
for(int j=i-1;j>=2;j--) q1[++t1]=a[j];
for(int j=i+1;j<=2*n;j++) q2[++t2]=a[j];
break;
}
}
op[1]=op[2*n]='L';
if(solve()) {
for(int i=1;i<=2*n;i++) printf("%c",op[i]);
puts("");
continue;
}
h1=h2=1;t1=t2=0;
for(int i=1;i<2*n;i++) {
if(a[i]==a[2*n]) {
for(int j=i-1;j>=1;j--) q1[++t1]=a[j];
for(int j=i+1;j<2*n;j++) q2[++t2]=a[j];
break;
}
}
op[1]='R';op[2]='L';
if(solve()) {
for(int i=1;i<=2*n;i++) printf("%c",op[i]);
puts("");
continue;
}
puts("-1");
}
return 0;
}
char :
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int n;
int a[N];
int q1[N],h1,t1;
int q2[N],h2,t2;
char op[N];
bool solve() {
int ix=1;
while(h1<=t1||h2<=t2) {
if(h1<=t1) {
if(h1!=t1&&q1[h1]==q1[t1]) {
ix++;
op[ix]=op[2*n+1-ix]='L';
h1++;t1--;
continue;
}
if(h2<=t2&&q1[t1]==q2[h2]) {
ix++;
op[ix]='L';
op[2*n+1-ix]='R';
t1--;h2++;
continue;
}
}
if(h2<=t2) {
if(h2!=t2&&q2[h2]==q2[t2]) {
ix++;
op[ix]=op[2*n+1-ix]='R';
h2++;t2--;
continue;
}
if(h1<=t1&&q2[t2]==q1[h1]) {
ix++;
op[ix]='R';
op[2*n-ix+1]='L';
t2--;h1++;
continue;
}
}
return 0;
}
return 1;
}
int main() {
int T;
scanf("%d",&T);
while(T--) {
scanf("%d",&n);
for(int i=1;i<=2*n;i++) scanf("%d",&a[i]);
h1=h2=1;t1=t2=0;
for(int i=2;i<=2*n;i++) {
if(a[i]==a[1]) {
for(int j=i-1;j>=2;j--) q1[++t1]=a[j];
for(int j=i+1;j<=2*n;j++) q2[++t2]=a[j];
break;
}
}
op[1]=op[2*n]='L';
if(solve()) {
for(int i=1;i<=2*n;i++) printf("%c",op[i]);
puts("");
continue;
}
h1=h2=1;t1=t2=0;
for(int i=1;i<2*n;i++) {
if(a[i]==a[2*n]) {
for(int j=i-1;j>=1;j--) q1[++t1]=a[j];
for(int j=i+1;j<2*n;j++) q2[++t2]=a[j];
break;
}
}
op[1]='R';op[2]='L';
if(solve()) {
for(int i=1;i<=2*n;i++) printf("%c",op[i]);
puts("");
continue;
}
puts("-1");
}
return 0;
}