首页 > 其他分享 >回文

回文

时间:2023-05-26 22:15:03浏览次数:36  
标签:q1 q2 back pop && front 回文

[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

相关文章

  • 回文数
    #include<stdio.h>intmain(){ inti=0;j=0;a[5],b[5],k=0,count=0,n=0; for(i=1;i<256;i++) { n=i*i; for(j=0,k=0;n!=0;j++,k++) { a[j]=n%10; n/=10; } for(j=0;j<k;j++) { b[j]=a[k-1-j]; } for(j=0,count=0;j<k;j++) { if(a[j]==b[j]) ......
  • 导出Excel,下载文件,返回文件流和报错信息处理
    downloadExcelCreateA(resData,fileName){//下载文件varblob=newBlob([resData],{type:'application/vnd.ms-excel'})vardownloadElement=document.createElement('a');varhref=window.URL.creat......
  • [USACO1.2]回文平方数 Palindromic Squares
    #[USACO1.2]回文平方数PalindromicSquares##题目描述回文数是指从左向右念和从右向左念都一样的数。如12321就是一个典型的回文数。给定一个用十进制表示的正整数B,输出所有[1,300]中,它的平方用B进制表示时是回文数的数。##输入格式共一行,一个单独的正整数B。##......
  • 力扣第409:最长回文串
    力扣第409:最长回文串回文串,正倒着读是一样的代码抄录自>我不想当菜鸟点击查看java代码```classSolution{publicintlongestPalindrome(Strings){int[]letter=newint[128];char[]cs=s.toCharArray();for(charc:cs){......
  • 剑指 Offer II 018(Java). 有效的回文(简单)
    题目:给定一个字符串s,验证s 是否是 回文串 ,只考虑字母和数字字符,可以忽略字母的大小写。本题中,将空字符串定义为有效的 回文串 。 示例1:输入:s="Aman,aplan,acanal:Panama"输出:true解释:"amanaplanacanalpanama"是回文串示例2:输入:s="raceacar"......
  • 回文数
    一、问题描述打印所有不超过n(取n<256)的其平方具有对称性质的数(也称回文数)。二、设计思路对于要判定的数n,计算出其平方后(存于a),按照“回文数”的定义要将最高位与最低位、次高位与次低位······进行比较,若彼此相等则为回文数。此算法需要知道平方数的位数,再一一将每一......
  • 力扣 647. 回文子串
    647.回文子串给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。回文字符串 是正着读和倒过来读一样的字符串。子字符串 是字符串中的由连续字符组成的一个序列。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。示......
  • 回文串和回文自动机
    1PAM简介1.1PAM的形式PAM是一个自动机,它的普通边组成了两棵树,fail边组成了一棵树。这两棵普通树分别表示主串中所有奇数长度的回文串和偶数长度的回文串,其根节点分别叫做“奇根”和“偶根”。普通边上有字母(类似trie/SAM的普通边,都是存\(\sum\)个外链,但是有一些是无......
  • 回文数
    ```#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#defineN10voidmain(){   intn[N];   inti,j,k,s=0,flag,a;   for(i=0;i<=256;i++)   {       a=i*i;flag=1;s=1;       for(j=10;a/j!=0;s......
  • response返回文件给前端
    @GetMapping("/getPdf2")publicvoidgetPdf2(HttpServletResponseresponse)throwsIOException{Filefile=newFile("D://aasd.pdf");FileInputStreamfileInputStream=newFileInputStream(file);ServletOu......