AtCoder Code festival 2017qualC-D-dp+优化
2017-11-07 11:49
381 查看
传送门
题意:
给你一个字符串s,问s最少分成几块,使得每一块在经过组合后都能成为一个回文串。(|s|≤2e5)
Solution:
我们可以转化一下“回文串”这个定义,对于每个字母我们可以把它分别转化到二进制的0-25位,然后如果一段字符串是回文串,那么这段字符串每个字符的异或一定是0或者2的幂,那么这道题就可以用dp做了:f[i]表示前i个字符的被分成的最小段数,转移即为
f[i]=min(f[j]+1)(1≤j<i,a[j]a[i]=0或2的幂)(a[i]为前缀异或和)f[i]=min(f[j]+1)(1≤j<i,a[j]a[i]=0或2的幂)(a[i]为前缀异或和)
但是这样写是n方的,会T掉,那怎么办呢?
记忆化,我们可以存储每一个子串状态的最小段数(子串状态可以用二进制表示),然后转移时枚举2的幂和0即可。
代码:
题意:
给你一个字符串s,问s最少分成几块,使得每一块在经过组合后都能成为一个回文串。(|s|≤2e5)
Solution:
我们可以转化一下“回文串”这个定义,对于每个字母我们可以把它分别转化到二进制的0-25位,然后如果一段字符串是回文串,那么这段字符串每个字符的异或一定是0或者2的幂,那么这道题就可以用dp做了:f[i]表示前i个字符的被分成的最小段数,转移即为
f[i]=min(f[j]+1)(1≤j<i,a[j]a[i]=0或2的幂)(a[i]为前缀异或和)f[i]=min(f[j]+1)(1≤j<i,a[j]a[i]=0或2的幂)(a[i]为前缀异或和)
但是这样写是n方的,会T掉,那怎么办呢?
记忆化,我们可以存储每一个子串状态的最小段数(子串状态可以用二进制表示),然后转移时枚举2的幂和0即可。
代码:
#include<cstdio> #include<cstring> #include<iostream> using namespace std; char s[200010]; int t[200010]; int f[200010]; int minn[(1<<26)+1]; int main() { scanf("%s",s+1); for (int i=1;i<=strlen(s+1);i++) t[i]=t[i-1],t[i]^=(1<<(s[i]-'a')); for (int i=0;i<=(1<<26)-1;i++) minn[i]=1e9; minn[0]=0; for (int i=1;i<=strlen(s+1);i++) { f[i]=1e9; for (int j=0;j<=25;j++) f[i]=min(f[i],minn[t[i]^(1<<j)]+1); f[i]=min(f[i],minn[t[i]]+1); minn[t[i]]=min(minn[t[i]],f[i]); } printf("%d",f[strlen(s+1)]); }
相关文章推荐
- [DP]Atcoder CODE FESTIVAL 2017 Final (Parallel) D - Zabuton
- 【二分图染色】AtCoder CODE FESTIVAL 2017(qual B)C[3 Steps]题解
- Atcoder CODE FESTIVAL 2016 qual C 的E题 Encyclopedia of Permutations
- atcoder CODE FESTIVAL 2017 qual A 手速(雾)赛
- 【AtCoder CODE FESTIVAL 2017 qual C】D - Yet Another Palindrome Partitioning (状压dp 字符串)
- Atcoder Code Festival 2016 Qual A D - マス目と整数 / Grid and Integers
- [Atcoder CODE FESTIVAL 2017 qual C]D - Yet Another Palindrome Partitioning 状压DP
- Atcoder CODE FESTIVAL 2017 qual C 总结+ABCD题解
- Atcoder CODE FESTIVAL 2017 Final 简要题解
- atcoder/CODE FESTIVAL 2017 qual B/B(dfs染色判断是否为二分图)
- Atcoder CODE FESTIVAL 2017 qual C D - Yet Another Palindrome Partitioning
- Atcoder Codefestival Exhibition/Team Relay/Tournament Round 简要题解
- 【题解】Popping Balls AtCoder Code Festival 2017 qual B E 组合计数
- 【AtCoder3913】【Peterzavodsk Contest 001 F】XOR Tree(状压DP)
- Xor Sum AtCoder - 2272 dp 转移方程
- AtCoder Grand Contest 001 E - BBQ Hard 数学+dp
- (dp)AtCoder Grand Contest 019 D - Shift and Flip
- (dp)AtCoder Regular Contest 081 E - Don't Be a Subsequence
- AtCoder Regular Contest 085 F NRE 线段树优化dp
- AtCoder Regular Contest 081 E - Don't Be a Subsequence(字符串DP)