传送门


当我打开Luogu题解发现这道题可以Hash+贪心的时候我的内心是崩溃的……

但是看到这道题不都应该认为这是一道PAM的练手好题么……

首先把原字符串重排为\(s_1s_ks_2s_{k-1}s_3s_{k-2}...\)之后,我们不难发现:在一种对原串的回文划分中,对应的一对字符串在新的字符串上对应了一个长度为偶数的回文串。

那么设\(dp_i\)表示将新字符串的长度为\(i\)的前缀划分为若干个长度为偶数的回文串,最多划分多少份。在回文树上可以进行转移。使用“一个长度为\(n\)串的回文后缀形成\(log n\)个等差数列”的结论将DP优化为\(O(nlogn)\)的复杂度。具体步骤可以看yyb的CF932G Palindrome Partition的题解

最后我们取\(\max(dp_i + [i < L](2 \mid i))\)作为答案。

注意悠着点开数组……

#include<bits/stdc++.h>
//this code is written by Itst
using namespace std; const int _ = 1e6 + 7;
char s[_] , tmp[_]; int dp[_] , pre[_] , T , L;
namespace PAM{
int trans[_][26] , fa[_] , len[_] , diff[_] , anc[_];
int cnt , lst; #define clr(x) memset(x , 0 , sizeof(x[0]) * (cnt + 1))
void init(){
clr(trans); clr(fa); clr(len); clr(diff); clr(anc);
lst = 0; cnt = 1; len[1] = -1; fa[0] = fa[1] = 1;
} void extend(int x){
int p = lst;
while(s[x - len[p] - 1] != s[x]) p = fa[p];
if(trans[p][s[x] - 'a'])
return (void)(lst = trans[p][s[x] - 'a']);
int k = ++cnt , q = fa[p];
while(s[x - len[q] - 1] != s[x]) q = fa[q];
fa[k] = trans[q][s[x] - 'a']; trans[p][s[x] - 'a'] = k;
len[k] = len[p] + 2; lst = k;
diff[k] = len[k] - len[fa[k]]; anc[k] = diff[k] == diff[fa[k]] ? anc[fa[k]] : k;
}
}
using namespace PAM; int main(){
#ifndef ONLINE_JUDGE
freopen("in","r",stdin);
//freopen("out","w",stdout);
#endif
for(scanf("%d" , &T) ; T ; --T){
memset(dp , -0x3f , sizeof(dp)); dp[0] = 0;
memset(pre , -0x3f , sizeof(pre));
scanf("%s" , tmp + 1); L = strlen(tmp + 1);
int cnt = 0;
for(int i = 1 , j = L ; i <= j ; (i + j - L) & 1 ? ++i : --j)
s[++cnt] = (i + j - L) & 1 ? tmp[i] : tmp[j];
init();
for(int i = 1 ; i <= L ; ++i){
extend(i);
for(int t = lst ; t ; t = fa[anc[t]]){
if(anc[t] != t)
pre[t] = max(pre[fa[t]] , dp[i - len[anc[t]]]);
else pre[t] = dp[i - len[anc[t]]];
if(!(i & 1))
dp[i] = max(dp[i] , pre[t]);
}
dp[i] += 2;
}
int MAX = 0;
for(int i = 0 ; i <= L ; i += 2)
MAX = max(MAX , dp[i] + (i < L));
cout << MAX << endl;
}
return 0;
}

LOJ2484 CEOI2017 Palindromic Partitions DP、回文树的更多相关文章

  1. 回文树练习 Part1

    URAL - 1960   Palindromes and Super Abilities 回文树水题,每次插入时统计数量即可. #include<bits/stdc++.h> using ...

  2. HDU5658:CA Loves Palindromic (回文树,求区间本质不同的回文串数)

    CA loves strings, especially loves the palindrome strings. One day he gets a string, he wants to kno ...

  3. Palindromic Tree 回文自动机-回文树 例题+讲解

    回文树,也叫回文自动机,是2014年被西伯利亚民族发明的,其功能如下: 1.求前缀字符串中的本质不同的回文串种类 2.求每个本质不同回文串的个数 3.以下标i为结尾的回文串个数/种类 4.每个本质不同 ...

  4. 回文树 Palindromic Tree

    回文树 Palindromic Tree 嗯..回文树是个什么东西呢. 回文树(或者说是回文自动机)每个节点代表一个本质不同的回文串. 首先它类似字典树,每个节点有SIGMA个儿子,表示对应的字母. ...

  5. ZOJ 3661 Palindromic Substring(回文树)

    Palindromic Substring Time Limit: 10 Seconds      Memory Limit: 65536 KB In the kingdom of string, p ...

  6. HDU 5658 CA Loves Palindromic(回文树)

    CA Loves Palindromic Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/O ...

  7. Palindrome Partition CodeForces - 932G 回文树+DP+(回文后缀的等差性质)

    题意: 给出一个长度为偶数的字符串S,要求把S分成k部分,其中k为任意偶数,设为a[1..k],且满足对于任意的i,有a[i]=a[k-i+1].问划分的方案数. n<=1000000 题解: ...

  8. [CEOI2017]Palindromic Partitions

    [CEOI2017]Palindromic Partitions 题目大意: 给出一个长度为\(n(n\le10^6)\)的只包含小写字母字符串,要求你将它划分成尽可能多的小块,使得这些小块构成回文串 ...

  9. Minimum Palindromic Factorization(最少回文串分割)

    Minimum Palindromic Factorization(最少回文串分割) 以下内容大部分(可以说除了关于回文树的部分)来自论文A Subquadratic Algorithm for Mi ...

随机推荐

  1. kafka 创建消费者报错

    kafka-console-consumer.sh --zookeeper master:2181,slave1:2181,slave2:2181 --topic test --from-beginn ...

  2. javascript轮询请求服务器

    抛出问题:web浏览器如何与服务保持通信? 方法一:Ajax轮询 方法二:EventSource轮询 方法三:websocket保持长连接 下面的解决方案是,Ajax轮询与EventSource轮询的 ...

  3. 前端如何搭建vue UI组件库/封装插件(从零到有)

    需求 因之前是做外包项目居多,经常用到相同的组件,之前的办法是在一个项目中写一个组件,其他项目直接将compents下的组件复制,粘贴到项目中使用,缺点是维护起来,改一个项目,其他项目也需要修改,所以 ...

  4. EasyEarth三维可视化解决方案——智慧河长

    EasyEarth—— 为河长装上“千里眼.顺风耳” 为各级河长办应急指挥.任务指派. 实绩考核提供快速直观的 高效.精准.智能化决策平台. 河长制背景 我国治水工作呈现出新老问题交织态势,河湖管理保 ...

  5. numpy.linalg.svd函数

    转载自:python之SVD函数介绍 函数:np.linalg.svd(a,full_matrices=1,compute_uv=1) 参数: a是一个形如\((M,N)\)的矩阵 full_matr ...

  6. cnetos6.5安装Varnish

    安装依赖包: tar -zxvf docutils-0.13.1.tar.gz python setup.py install unzip pcre2-10.23.zip ./configure -- ...

  7. 差分形式的牛顿插值法(c++)

    本程序对cosx函数进行插值,取步长为0.1,因此x的值为0.00,0.10,0.20,0.30,对应的y值为cos(0.00),cos(0.10),cos(0.20),cos(0.30),其实本程序 ...

  8. 菜鸟学IT之Hadoop综合大作业

    Hadoop综合大作业 作业来源:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/3363 1.将爬虫大作业产生的csv文件上传到HDF ...

  9. tensorflow运行时openssl与boringssl兼容性问题

    tensorflow中,grpc使用boringssl进行加密,boringssl是google基于openssl自行开发的一条分支,有许多相同函数,但底层实现以及支持的加密类型有不同. 且tenso ...

  10. auto-sklearn

    python机器学习-乳腺癌细胞挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003&u ...