首页 > 其他分享 >CF1951E No Palindromes 题解

CF1951E No Palindromes 题解

时间:2024-04-08 16:30:47浏览次数:24  
标签:GCC Palindromes No int 题解 ce len pragma optimize

题目大意

给出一个字符串 s s s,要求将 s s s 分为若干个非回文子串,输出一组可行解或输出 − 1 -1 −1 报告无解。

解题思路

我们考虑将连续的相同字符分为一段,然后将没两段或三段合并,得到答案。设划分后有 m m m 段,具体情况如下:

  1. s s s 本身为非回文串,那么直接输出 s s s 就可以了,此时字串数为 1 1 1;
  2. 划分后共有偶数段,这种情况直接相邻两段合并即可,子串数为 m 2 \frac{m}{2} 2m​;
  3. 划分后有奇数段,那么这时我们需要将某些段三个合并,情况如下:
    1. 存在一个段使得它的长度大于 1 1 1 且编号为偶数,这个时候我们将这个段从中间任意一处分为两段,新得到的两段分别与前后两段合并,这时子串数量为 ⌈ m 2 ⌉ \lceil \frac{m}{2} \rceil ⌈2m​⌉;
    2. 存在一个段使得长度大于 1 1 1 且编号为奇数,不妨设它为 a i a_i ai​,这个时候我们同样把它从中间某一处断开,使得 a i − 2 ≠ a i ∨ a i + 2 ≠ a i a_{i-2}\not= a_i \vee a_{i+2}\not= a_i ai−2​=ai​∨ai+2​=ai​,我们将分开后的两个段分别与前后三个段合并,这时子串个数为 ⌊ m 2 ⌋ \lfloor \frac{m}{2} \rfloor ⌊2m​⌋;
  4. 其他情况无解,输出 − 1 -1 −1;

AC 代码

#pragma GCC optimize(3)
#pragma GCC target("avx")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#include<stdio.h>
#include<string.h>
#define N 1000005
int n,m; char s[N];
struct STR{int len;
char ch;}a[N],b[N];
inline bool hw(){ for(int i=1;i<=n;++i)
        if(s[i]!=s[n-i+1]) return false;
    return true;
}inline void work(){
    scanf("%s",s+1); m=0;n=strlen(s+1);
    for(int i=1;i<=n;++i) if(s[i]!=s[i-1]) 
    a[++m].ch=s[i],a[m].len=1; else ++a[m].len;
    if(!hw()){ printf("YES\n1\n"); printf("%s",s+1);
    putchar('\n');return;}if(m==1){puts("NO");return;}
    else if(m&1){ bool is=false; for(int i=2;i<m;++i)
        if(a[i].len>1&&(i%2==0)){is=true;break;}
        if(is){ puts("YES"); printf("%d\n",(m+1)/2);
            bool flag=false;for(int i=1;i<=m;++i){ if(i==1||i==m){
                for(int j=1;j<=a[i].len;++j) putchar(a[i].ch);
                continue;} if(!flag&&a[i].len>1&&(i%2==0)){
                putchar(a[i].ch);putchar(' ');
                for(int j=1;j<a[i].len;++j) putchar(a[i].ch);
                flag=true; continue;
                } for(int j=1;j<=a[i].len;++j) putchar(a[i].ch);
                if(!flag&&(i%2==0)) putchar(' ');
                else if(flag&&(i&1)) putchar(' ');
            } putchar('\n');
        }else{ is=false;
            for(int i=1;i<=m-2;i+=2){ if(i==m) continue;
                if(a[i].len!=a[i+2].len){ is=true;break;}
                if(a[i].ch!=a[i+2].ch){ is=true;break; }
            } if(!is){ int ce=0; for(int i=3;i<=m-2;++i)
                if(i&1&&(a[i].len>1)){ is=true;break; }
                if(!is){puts("NO");return;}
                int pos=0,flag=0; for(int i=1;i<=m;++i)
                if((!flag)&&(i&1)&&a[i].len>1&&i!=1&&i!=m){
                    int l=0,r=a[i].len;
                    if(r==a[i+2].len) ++l,--r;
                    if(l==a[i-2].len) ++l,--r;
                    b[++ce].ch=a[i].ch,b[ce].len=l;
                    b[++ce].ch=a[i].ch,b[ce].len=r;
                    pos=ce-1; flag=true;
                }else b[++ce]=a[i];
                printf("YES\n%d\n",(ce-2)/2);
                for(int i=1;i<=ce;i+=2)
                if(i+2!=pos){ for(int j=1;j<=b[i].len;++j) putchar(b[i].ch);
                    for(int j=1;j<=b[i+1].len;++j) putchar(b[i+1].ch);
                    putchar(' ');
                }else{ for(int j=1;j<=b[i].len;++j) putchar(b[i].ch);
                    for(int j=1;j<=b[i+1].len;++j) putchar(b[i+1].ch);
                    for(int j=1;j<=b[i+2].len;++j) putchar(b[i+2].ch);
                    putchar(' '); i+=3;
                    for(int j=1;j<=b[i].len;++j) putchar(b[i].ch);
                    for(int j=1;j<=b[i+1].len;++j) putchar(b[i+1].ch);
                    for(int j=1;j<=b[i+2].len;++j) putchar(b[i+2].ch);
                    putchar(' '); i+=1;
                } putchar('\n'); return;
            }
            puts("YES");
            printf("%d\n",(m-1)/2);
            bool flag=false;
            for(int i=1;i<=m;i+=2){  if(!flag)
                if(a[i].len!=a[i+2].len||a[i].ch!=a[i+2].ch){
                    for(int j=1;j<=a[i].len;++j) putchar(a[i].ch);
                    for(int j=1;j<=a[i+1].len;++j) putchar(a[i+1].ch);
                    for(int j=1;j<=a[i+2].len;++j) putchar(a[i+2].ch);
                    putchar(' '); ++i; flag=true;continue;
                } for(int j=1;j<=a[i].len;++j) putchar(a[i].ch);
                for(int j=1;j<=a[i+1].len;++j) putchar(a[i+1].ch);
                putchar(' ');
            } putchar('\n');
        }
    }else{ printf("YES\n%d\n",m/2);
        for(int i=1;i<=m;i+=2){
        for(int j=1;j<=a[i].len;++j) putchar(a[i].ch);
        for(int j=1;j<=a[i+1].len;++j) putchar(a[i+1].ch);
        putchar(' '); } putchar('\n');
    }
} signed main(){
    int T;scanf("%d",&T);
    while(T--) work();
}

标签:GCC,Palindromes,No,int,题解,ce,len,pragma,optimize
From: https://blog.csdn.net/m0_73020012/article/details/137511568

相关文章

  • Feature flag __VUE_PROD_HYDRATION_MISMATCH_DETAILS__ is not explicitly defined.
    由于defineModel在vue3.4版本才能使用,原有项目依赖为"vue":"^3.3.4", "@vitejs/plugin-vue":"^4.1.0",升级项目中vue版本后出现如下警告:Featureflag__VUE_PROD_HYDRATION_MISMATCH_DETAILS__isnotexplicitlydefined.Youarerunningtheesm-bund......
  • unordered_map的理解和应用
    1、介绍unordered_map,它是一个关联容器,内部采用的是hash表结构,拥有快速检索的功能。1.1、特性关联性:通过key去检索value,而不是通过绝对地址(和顺序容器不同)无序性:使用hash表存储,内部无序Map:每个值对应一个键值键唯一性:不存在两个元素的键一样动态内存管理:使用内存管理......
  • 谢启鸿高等代数第四版习题7.7部分习题解析part2.以及部分第7章复习题
    7.7部分定理:以为特征值的K阶若当块个数为11.设n阶矩阵A的特征值全为1,求证:对任意的正整数K,与A相似。证明:=(易证故此处不再证明)而且的特征值全为1。的特征值为1的k阶若当块的个数为接下来只需证明相似于即可;即证明两者有相同的约当标准型.由书上7.8节的数学归纳可以知道......
  • 用node读取Excel指定sheet并输出想要的数据结构
    数据部门维护了一个Excel表格,前端显示需要其中一个sheet的数据,这个表老是更新,想着用node写一个程序,每次数据部门更新直接跑一遍。直接上代码:constXLSX=require('xlsx');constpath=require('path');constfs=require('fs');//读取Excel文件constexcelFile='要读......
  • Unity编辑器中运行正常,发布后报shader为null异常问题解决方案
    在Unity中,Shader是从代码中进行加载的,编辑器中并没有引用。在编辑器中运行项目没有问题,但当项目发布到移动平台,如ios、android、UWP之后,游戏中并不能找到对应的shader。因为Shader在场景中并未被引用,所以没有被打包。解决办法1在ProjectSettings里面的Graphics,添加上修改的打包......
  • P4462 题解
    题目传送门请确保您接触过莫队再阅读此文:对于所有询问,和普通莫队一样的分块然后排序。在这里只讨论add和del操作的具体实现。题目中需要求一段区间的异或值,所以我们可以预处理序列\(a\)的“前缀异或值”pre_xor,题目中的\(a_x\bigoplusa_{x+1}\bigoplus\dots\bigopl......
  • node.js 安装及配置环境变量只看此文
    转发:https://blog.csdn.net/u014212540/article/details/1302606791.node.js安装2.Node.js环境变量配置3.国内镜像网站配置4.npm、yarn、pnpm、nrm常用命令4.1nrm常用命令:4.2npm常用指令:4.3yarn常用命令:5.常规上传至npm公共注册表方法(npmpublish/yarnpublish)......
  • 魅蓝note6 Android 7安卓Magisk
    概览用来刷机的魅蓝note6,刷入了Flyme7国际版,为了保证系统的流畅性,没有刷入更高版本的系统,于是该设备的android版本为7,在安装Magisk后是没办法加载LSPosed模块的,后面安装了LineageOS升级Android到了11,成功安装好了Magisk。安装Magisk魅蓝note6解锁bootloader,Meizu/魅蓝Note6(......
  • P1002 [NOIP2002 普及组] 过河卒
    题意:卒子过河,有个马,问安全到达终点的路径有多少条。起点在0,0。每一步可以往右或者往下。思路:处理出马的看守点,然后暴力。。看了一下暴力会TLE。400^2.直接dp转移即可。总结:不知道这个还要开longlong,哎。!voidsolve(){pair<int,int>destination;vector<pair<int......
  • 计算机毕业设计项目:springboot 智能答疑系统 96852(开题答辩+程序定制+全套文案 )上万套
    毕业论文(设计) 题   目springboot智能答疑系统学   院       XXXXX     专业班级   XXXXX学生姓名       XXXX    指导教师            XXXX          撰写日期:202 年 月 日目 录摘要......