1 solutions

  • 0
    @ 2026-8-27 22:18:52
    #include<bits/stdc++.h>
    using namespace std;
    const int N=500010*2;
    int n;
    int w[N];
    int find(int l,int r,int x) //找到l到rx出现的位置
    {
        for(int i=l;i<=r;i++)
        {
            if(w[i]==x)
            {
                return i;
            }
        }
        return -1;
    }
    string work(int l1,int r1,int l2,int r2)
    {
        string a,b; //a表示先选,b表示后选
        for(int i=1;i<n;i++) //还剩余n-1对数字
        {
            if(l1<r1&&w[l1]==w[r1]) //第一段里面
            {
                a+='L',b+='L';
                l1++,r1--;
            }
            else if(l1<=r1&&l1<=r2&&w[l1]==w[l2]) //先取左边,再取右边
            {
                a+='L',b+='R';
                l1++,l2++;
            }
            else if(l1<=r1&&l2<=r2&&w[r2]==w[r1]) //先取右边,再取左边
            {
                a+='R',b+='L';
                r2--,r1--;
            }
            else if(l2<r2&&w[l2]==w[r2]) //只能从右边取
            {
                a+='R',b+='R';
                l2++,r2--;
            }
            else return ".";
        }
        reverse(b.begin(),b.end()); //翻转一下
        return a+b;
    }
    int main()
    {
        int T;
        cin>>T;
        while(T--)
        {
            cin>>n;
            for(int i=0;i<2*n;i++)
            {
                cin>>w[i];
            }
            int t=find(1,n*2-1,w[0]); //从左边选
            string res="L"+work(1,t-1,t+1,2*n-1)+"L";
            if(res!="L.L") puts(res.c_str());
            else
            {
                t=find(0,n*2-2,w[n*2-1]); //从右边选
                res="R"+work(0,t-1,t+1,n*2-2)+"L";
                if(res!="R.L") puts(res.c_str());
                else puts("-1");
            }
        }
        return 0;
    }
    

    Information

    ID
    1148
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    10
    Tags
    # Submissions
    11
    Accepted
    2
    Uploaded By