回文

[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;
}
posted @ 2023-05-26 21:51  wscqwq  阅读(7)  评论(0编辑  收藏  举报