博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Atcoder】CODE FESTIVAL 2017 qual C D - Yet Another Palindrome Partitioning
阅读量:6967 次
发布时间:2019-06-27

本文共 965 字,大约阅读时间需要 3 分钟。

【题意】给定只含小写字母的字符串,要求分割成若干段使段内字母重组顺序后能得到回文串,求最少分割段数。n<=2*10^5

【算法】DP

【题解】关键在于快速判断一个字符子串是否合法,容易发现合法仅当不存在或只存在一个奇数字符,其余字符均为偶数。

当涉及到奇偶性(%2)时,很自然能想到异或。

将小写字母a~z转化2^0~2^25,那么一个字符子串合法当且仅当其连续异或值是0或2^i(0<=i<=25)

令f[i]表示前i个合法的最少段数,sum[i]表示异或前缀和,则有:

f[i]=min(f[j])+1,sum[i]^sum[j]=0||2^i,也就是在前面所有合法的j中取最小的f[j]。

将合法条件移项,得到sum[i]^(0||2^i)=sum[j],那么对于当前的i,可以快速算出需要的sum[j]。

而sum值只有2*10^5个,可以用map存起来,然后就可以快速取用。

或者sum值本身不大,根据题目空间直接开数组也没问题。

复杂度O(26*n)。

#include
#include
#include
#include
#include
#include
#define ll long longusing namespace std;int read(){ char c;int s=0,t=1; while(!isdigit(c=getchar()))if(c=='-')t=-1; do{s=s*10+c-'0';}while(isdigit(c=getchar())); return s*t;}int min(int a,int b){ return a
0?x:-x;}void mins(int &a,int b){ if(a>b)a=b;}void maxs(int &a,int b){ if(a
View Code

 

转载于:https://www.cnblogs.com/onioncyc/p/7725875.html

你可能感兴趣的文章
《UNIX网络编程 卷1:套接字联网API(第3版)》——8.9 服务器进程未运行
查看>>
下一代 OS X 将被重新设计,再次向 iOS 看齐
查看>>
ThinkphpHelper 0.33 发布,Thinkphp 生成工具
查看>>
如期而至的 Swarm 新工具 Crane 开源解读
查看>>
《编写高质量代码:改善c程序代码的125个建议》——建议12-4:用移位运算实现乘除法运算...
查看>>
开源种子计划许可证争议引发的出乎意料的结果
查看>>
android studio运行模拟器报minsdk(api 21) &gt; devicesdk(api 17)的解决方法
查看>>
Apache DeltaSpike 1.3.0 发布,便捷 CDI 扩展
查看>>
医疗物联网的发展,成为患者真正享受到的福音!
查看>>
Red Hat 宣布收购开源软件公司 Ansible
查看>>
《数据科学:R语言实现》——2.4 扫描文本文件
查看>>
商业与开源的矛盾?OmniTI 将 OmniOS 剥离给开源社区
查看>>
《IP组播(第1卷)》一第1章 IP组播入门1.1 组播解决了什么问题
查看>>
xmemcached发布1.3.2版本
查看>>
我深入学习C语言的三个目的
查看>>
[科普]文科生也能读懂的Deep Learning
查看>>
Inxi:获取Linux的系统和硬件信息
查看>>
JVM 内部运行线程介绍
查看>>
Linux有问必答:如何通过命令行创建和设置一个MySQL用户
查看>>
介绍 Linux 的命名空间
查看>>