[CSP-S 2021] 回文
首先考虑爆搜。我们可以先确定 \(b\) 的第一个位置和最后一个位置,然后将数列放入两个队列中。
4 1 2 4 5 3 1 2 3 5
这是样例,首先最优的情况当然是第一个位置和最后一个位置都取 L,即 \(4\)。
两个队列分别是 \(q1=[1,2]\) 和 \(q2=[5,3,1,2,3,5]\)。
然后从两头向中间考虑。
首先,取 LL 是最优的,我们先考虑是否能这样做,即尝试取第一个队列的首尾(显然不行)
然后是 LR,取 \(1,5\)。
RL,\(2≠5\)。
RR,\(5=5\)。
所以这两个位置就是 RR。
以此类推,一个贪心的过程。
这个显然(其实是不会证明)对的。
#include<cstdio>
#include<queue>
using namespace std;
#define Ls(i,l,r) for(int i=l;i<r;++i)
#define Rs(i,l,r) for(int i=r;i>l;--i)
#define L(i,l) for(int i=1;i<=l;++i)
const int N=1000010;
int T,n,a[N];
char b[N];
int main(){
// freopen("1.in","r",stdin);
// freopen("1.out","w",stdout);
// ios::sync_with_stdio(0);
// cin.tie(0);
// cout.tie(0);
scanf("%d",&T);
while(T--){
int n;
scanf("%d",&n);
n<<=1;
L(i, n)scanf("%d",a+i);
b[1]='L',b[n]='L';
int p=2;
deque<int>q1,q2;
while(a[p]!=a[1])q1.push_back(a[p++]);
++p;
while(p<=n)q2.push_back(a[p++]);
p=2;
while(1){
//LL
if(q1.size()>1&&q1.front()==q1.back()){
b[p]='L',b[n-p+1]='L';
q1.pop_front();
q1.pop_back();
p++;continue;
}
//LR
if(!q1.empty()&&!q2.empty()&&q1.front()==q2.front()){
b[p]='L',b[n-p+1]='R';
q1.pop_front();
q2.pop_front();
p++;continue;
}
//RL
if(!q1.empty()&&!q2.empty()&&q2.back()==q1.back()){
b[p]='R',b[n-p+1]='L';
q1.pop_back();
q2.pop_back();
p++;continue;
}
//RR
if(q2.size()>1&&q2.back()==q2.front()){
b[p]='R',b[n-p+1]='R';
q2.pop_front();
q2.pop_back();
p++;continue;
}
break;
}
if(q1.empty()&&q2.empty()){
L(i, n)printf("%c",b[i]);
puts("");
continue;
}
b[1]='R',b[n]='L';
q1.clear();
q2.clear();
p=1;
while(a[p]!=a[n])q1.push_back(a[p++]);
++p;
while(p<n)q2.push_back(a[p++]);
p=2;
while(1){
//LL
if(q1.size()>1&&q1.front()==q1.back()){
b[p]='L',b[n-p+1]='L';
q1.pop_front();
q1.pop_back();
p++;continue;
}
//LR
if(!q1.empty()&&!q2.empty()&&q1.front()==q2.front()){
b[p]='L',b[n-p+1]='R';
q1.pop_front();
q2.pop_front();
p++;continue;
}
//RL
if(!q1.empty()&&!q2.empty()&&q2.back()==q1.back()){
b[p]='R',b[n-p+1]='L';
q1.pop_back();
q2.pop_back();
p++;continue;
}
//RR
if(q2.size()>1&&q2.back()==q2.front()){
b[p]='R',b[n-p+1]='R';
q2.pop_front();
q2.pop_back();
p++;continue;
}
break;
}
if(q1.empty()&&q2.empty()){
L(i, n)printf("%c",b[i]);
puts("");
continue;
}
puts("-1");
}
return 0;
}
标签:q1,q2,back,pop,&&,front,回文
From: https://www.cnblogs.com/wscqwq/p/17435911.html