博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
atcoder Yet Another Palindrome Partitioning(dp)
阅读量:2148 次
发布时间:2019-04-30

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

题意:

给出一个字符串,最少需要多少次拆分得到的子串都是合法的,合法的定义是改变字符串顺序能得到一个回文串。

解题思路:

容易想到的是一个合法的字符串的26个字母最多只能一个字母出现次数为奇数,用26位二进制数(mask)表示,1表示奇数的话,只有能整除2的和0是合法的。

dp想法是每个状态减去一个合法串然后转移过来,但是显然不能for一下,这时候就利用下上面的mask。

用mask表示前缀串里字母的奇偶性,转移就是,在当前的字符串下,砍掉一个合法的子串,就是可以转移过来的状态,砍掉一个有一个字母是奇数的子串等价于maks^(1<<j),j是26个字母,砍掉一个全是偶数的子串就等价于mask自己(mask^0=mask)。用一个map记录mask对应的值就好。

代码:

#include 
using namespace std;const int maxn=2e5+5;char str[maxn];unordered_map
mi;int get(int x){ if(mi.count(x)) { return mi[x]; } return maxn;}void add(int x, int val){ if(!mi.count(x)) { mi[x]=val; } else mi[x]=min(mi[x], val);}int main(){ scanf("%s", str); int i, j; int dp=0, mask=0; for(i=0; str[i]; i++) { add(mask, dp); mask^=1<<(str[i]-'a'); dp=get(mask)+1; for(j=0; j<26; j++) { dp=min(dp, get(mask^(1<

转载地址:http://goywb.baihongyu.com/

你可能感兴趣的文章
稻草人手记
查看>>
第一次kaggle比赛 回顾篇
查看>>
leetcode 50. Pow(x, n)
查看>>
leetcode 130. Surrounded Regions
查看>>
【托业】【全真题库】TEST2-语法题
查看>>
博客文格式优化
查看>>
【托业】【新托业全真模拟】疑难语法题知识点总结(01~05)
查看>>
【SQL】group by 和order by 的区别。
查看>>
【Python】详解Python多线程Selenium跨浏览器测试
查看>>
Jmeter之参数化
查看>>
Shell 和Python的区别。
查看>>
Python 列表(list)、字典(dict)、字符串(string)常用基本操作小结
查看>>
Loadrunner之https协议录制回放报错如何解决?(九)
查看>>
python中xrange和range的异同
查看>>
列表、元组、集合、字典
查看>>
【Python】easygui小甲鱼
查看>>
【Python】关于Python多线程的一篇文章转载
查看>>
【Pyton】【小甲鱼】文件
查看>>
【Pyton】【小甲鱼】永久存储:腌制一缸美味的泡菜
查看>>
【Pyton】【小甲鱼】异常处理:你不可能总是对的
查看>>