首页 > 其他分享 >AT_code_festival_2017_qualc_d - Yet Another Palindrome Partitioning 题解

AT_code_festival_2017_qualc_d - Yet Another Palindrome Partitioning 题解

时间:2024-08-27 16:25:29浏览次数:3  
标签:Partitioning code int 题解 复杂度 异或 优化 dp 回文

Yet Another Palindrome Partitioning 题解

题目大意

给出一个字符串,求把这个字符串划分成最少的小段,使每个小段都可以经过字母重组后为回文串。

题目分析

如果暴力的话,需要 DFS 段数、每一段的左节点、右节点,以及判断是否为回文串,时间复杂度在 \(O(|S|^{|S|})\) 左右。

但是本题需要将字符串划分成若干子串,那么就可以考虑 DP。那么可以写出一个状态转移方程:

\[dp_i=\min(dp_j+1) ,j \leq i,S_{i\sim j}为回文串 \]

其中 \(dp_i\) 表示 \(S\) 的前 \(i\) 个字符被划分成满足题意的子串最少的划分数,\(i\) 是当前这段的右节点,\(j\) 是需要匹配的左节点。要使答案最小,肯定是取 \(\min\) 值。

时间复杂度 \(O(|S|^3)\) (这里判断回文还有线性的时间复杂度)。

那么考虑优化:

优化 1

首先判断回文的线性复杂度是非常可恶的,必须优化掉。

传统的判断回文是将字符串左右对比,那么有没有一种办法可以 \(O(1)\) 对比呢?我们可以使用异或进行优化。根据异或的性质,\(a \oplus b \oplus b=a\),那么左右相同的字符就会抵消掉。为了不出现冲突(即两个不同的字符异或后有一部分变了),需要给每一个字符一个特定的值,将 a 赋 \(2^0\),给 b 赋 \(2^1\) \(......\)

那么回文串就有两种情况:

1.例如 abcba 一样的,奇数个字符的回文串,异或优化后会剩下中间的字符(即剩下 \(2^{x}\))。

2.例如 abba 一样的,偶数个字符的回文串,异或优化后什么也不剩了(即剩下 0)。

由于本题只考虑小写英文字母,时间复杂度 \(O(26|S|^2)\)

优化 2

有一点记忆化的思想,将 \(dp_i\) 的值存储起来,每次更新更优的,就可以优化取 \(\min\) 值的时间。

最后还需要用 bitset 优化 \(dp\) 数组,否则要爆(bitset 可以 \(O(1)\) 对整个数组进行位运算)。

代码放上来

#include<bits/stdc++.h>
using namespace std;

string s;
int dp[200005];
int xop[200005];//存储每个字符值的前缀异或
int w[1<<26];//存储每个字符的最优 dp 值

int main(void)
{
    memset(w,0x7f,sizeof(w));
    w[0]=0;
    cin>>s;
    for(int i=0;i<s.length();i++)
        xop[i]=(i==0?1<<s[i]-'a':xop[i-1]^(1<<s[i]-'a'));//预处理前缀异或值
    for(int i=0;i<s.length();i++)
    {
        dp[i]=w[xop[i]];
        for(int j=0;j<26;j++)
            dp[i]=min(dp[i],w[xop[i]^(1<<j)]);
        w[xop[i]]=min(w[xop[i]],dp[i]);//更新更优的 dp 值
        dp[i]++;
    }
    cout<<dp[s.length()-1];
    return 0;
}

本题完结散花

Solution By Luogu 凤凰工作室

标签:Partitioning,code,int,题解,复杂度,异或,优化,dp,回文
From: https://www.cnblogs.com/dijkstraphoenix/p/18382970

相关文章

  • VScode+QT 无法自动补全代码的解决方法
    问题:没有添加包含的头文件路径,即include文件夹所在位置第一步找到库路径并复制(在qt安装路径中)第二步打开vscode环境配置文件,添加库路径最终效果头文件红色波浪线消失了,并且代码可以完美补全!注意事项请根据自己的来修改。记得把路径的\更换成\\或者用/表示记得在incl......
  • AtCoder Beginner Contest 052
    A-TwoRectangles#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;intmain(){ ios::sync_with_stdio(false),cin.tie(nullptr); intA,B,C,D; cin>>A>>B>>C>>D; cout<<max(A*B,C*D); ......
  • Dirsearch-master安装使用及常见问题解决(互联网和内网)
    1、文档概述        本手册适用于帮助初学者快速掌握Dirsearch-master的安装、配置与使用方法。通过阅读本文档,您将能够了解如何搭建Dirsearch-master环境、扫描目标服务器上潜在的敏感文件和目录,并解读生成的报告。此外,本文档还涵盖了常见问题及解决方法,以便您在实际......
  • Unity之OpenXR如何使用Netcode实现一个多人VR游戏
    前言NetcodeforGameObjects是专为Unity构建的高级网络库,可用于抽象网络逻辑。您可以通过网络会话同时向许多玩家发送GameObjects和世界数据。借助NetcodeforGameObjects,您可以专注于构建游戏,而无需考虑低级协议和网络框架。Netcode框架的核心特性包括:易于使用:......
  • 【题解】P3210 [HNOI2010] 取石头游戏
    \(\large\mathfrak{1st.\Preamble|}\)前言题目传送门:P3210[HNOI2010]取石头游戏)主要是参考楼下大佬的题解,对于其中没讲到或比较难懂的地方进行讲解,以及配上了图。\(\large\mathfrak{2nd.\Solution|}\)题解楼下大佬的比喻十分形象生动地描绘了俩人去石头的过程:取石子......
  • 程序员必备的的5个刷题网站。大厂面试稳了 力扣 https://leetcode.cn
    程序员必备的的5个刷题网站。大厂面试稳了力扣https://leetcode.cn1、leetcode力扣。网址:https://leetcode.cnLeetCode是一个定位为求职的刷题网站,其中又以算法题为主。很多大厂在面试的时候,都会考算法。有空就刷一刷这里面的算法题,你的算法水平肯定会有大幅的提升,不管是求职,......
  • AtCoder Beginner Contest 051
    A-Haiku直接模拟。#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;intmain(){ ios::sync_with_stdio(false),cin.tie(nullptr); strings; cin>>s; stringa,b,c; a=s.substr(0,5); b=s.substr(6,7); c=s.substr(......
  • 题解:P10922 Happybob's Numbers (UBC001B)
    主要思路:贪心,构造。思路构造题,首先明确要删的就是小于\(n\)的数,因为若删了大于等于\(n\)的数就无法进行之后的操作了。那这道题就简单了,先从大到小排序,遇到小于当前长度\(k\)的数,就将这个数删掉,这时长度需减\(1\),毕竟顺序可以自己调,将下一个小于当前\(k\)的数,放到下一......
  • 题解:P5934 [清华集训2012] 最小生成树
    主要思路:网络流。思路先考虑最小生成树,如果一条边边权大于等于选中的边,那么这条边是否删去没有任何影响。按边权排序,对于边\((u,v,L)\),若要加上当且仅当\(u\)和\(v\)并不联通。把所有边权比选定的边的边权小的边拿出来连上,流量均为\(1\),最小割。最大树同理,连上边权比选......
  • 题解:P11007 『STA - R7』Odtlcsu
    评价:简单构造。思路注意题目中的“如果有多解输出任意一种即可”。由于\(a\)与\(a^{2}\)的奇偶性必定是一致的,所以我们可以将情况分为两种。当\(x\)与\(y\)奇偶性不一致时,但由于\(a\)与\(a^{2}\)的奇偶性必定是一致的,所以始终无法构造出正确的序列。但注意题目......