[CF1234F] Yet Another Substring Reverse - 字符串,状压DP
CF1234F Yet Another Substring Reverse
Description
给定一个字符串,可以任意翻转一个子串,求最终满足所有字符互不相同的子串的最大长度。
数据范围: \(n \le 10^6, \Sigma \le 20\)
Solution
由于被翻转子串的选择是任意的,我们可以将最终的子串看作两个原串的前缀的后缀的拼合。由于题目的各种性质,我们只需要考虑所有子串构成的字符集的所有可能状态,而与位置无关。
而字符集的状态依然要求不能有重复字符,因此对于每一个位置的字符,以它结尾的子串最多只有 \(\Sigma\) 个是合法的,因此我们状压并 \(O(n\Sigma)\) 扫一遍即可处理出字符集的所有状态。
原问题要求的是两个互斥的字符集 \(P,Q\) ,相当于把字符集划分为对立的两部分 \(A,B\), 并取任意 \(P \subset A, Q \subset B\) 。我们 \(O(\Sigma 2^\Sigma)\) 预处理出子集前缀和,暴力枚举这种对立的划分,即枚举子集,即可在 \(O(2^\Sigma)\) 时间计算出答案。
Code
#include <bits/stdc++.h>
using namespace std;
const int N = 2100005;
int n,f[N],g[N];
char s[N];
int main() {
scanf("%s",s+1);
n=strlen(s+1);
for(int i=1; i<=n; i++)
s[i]-='a';
vector <int> v,w;
f[0]=1;
v.push_back(0);
for(int i=1; i<=n; i++) {
for(int j=0; j<v.size(); j++)
if((v[j]&(1<<s[i]))==0) {
int p=v[j]|(1<<s[i]);
f[p]=1;
w.push_back(p);
}
swap(v,w);
w.clear();
v.push_back(0);
}
for(int i=0; i<1<<20; i++) {
int cnt = 0;
for(int j=0; j<20; j++)
cnt += (i>>j)&1;
if(f[i])
g[i]=cnt;
if(g[i])
for(int j=0; j<20; j++)
g[i|(1<<j)]=max(g[i|(1<<j)], g[i]);
}
int ans = 0;
for(int i=0; i<1<<20; i++)
ans=max(ans, g[i]+g[i^((1<<20)-1)]);
cout<<ans<<endl;
}
[CF1234F] Yet Another Substring Reverse - 字符串,状压DP的更多相关文章
- Codeforces1234F. Yet Another Substring Reverse(状压dp)
题目链接:传送门 思路: 由于只能翻转一次子串,就相当于找出两个不连续的子串,把在后面的一个子串翻转过来,和第一个子串拼接. 因为题目仅要求子串中的字符不重复,所以字符的先后顺序无关,翻转的操作就相当 ...
- 【BZOJ4560】[JLoi2016]字符串覆盖 KMP+状压DP
[BZOJ4560][JLoi2016]字符串覆盖 Description 字符串A有N个子串B1,B2,…,Bn.如果将这n个子串分别放在恰好一个它在A中出现的位置上(子串之间可以重叠)这样A中的若 ...
- fzu2188 状压dp
G - Simple String Problem Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%I64d & ...
- FZU - 2218 Simple String Problem(状压dp)
Simple String Problem Recently, you have found your interest in string theory. Here is an interestin ...
- 【62测试】【状压dp】【dfs序】【线段树】
第一题: 给出一个长度不超过100只包含'B'和'R'的字符串,将其无限重复下去. 比如,BBRB则会形成 BBRBBBRBBBRB 现在给出一个区间[l,r]询问该区间内有多少个字符'B'(区间下标 ...
- CCF 201312-4 有趣的数 (数位DP, 状压DP, 组合数学+暴力枚举, 推公式, 矩阵快速幂)
问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次. 2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前. 3. 最高 ...
- bzoj 1879 [Sdoi2009]Bill的挑战(状压DP)
Description Input 本题包含多组数据. 第一行:一个整数T,表示数据的个数. 对于每组数据: 第一行:两个整数,N和K(含义如题目表述). 接下来N行:每行一个字符串. Output ...
- Codeforces 544E Remembering Strings 状压dp
题目链接 题意: 给定n个长度均为m的字符串 以下n行给出字符串 以下n*m的矩阵表示把相应的字母改动成其它字母的花费. 问: 对于一个字符串,若它是easy to remembering 当 它存在 ...
- Tirp(状压DP)
Description 有一个N*N的迷宫,其中有一些宝藏,现在,小A要从入口(1,1)出发,到达出口(N,N),每次,小A只能从当前的格子走到上下左右四个格子,为了不空手而归,小A决定要拿到所以的宝 ...
随机推荐
- selenium获取缓存数据
爬虫呢有时候数据方便有时候登入获得cookies,以及获取他存缓存中的数据 一.获取缓存中的数据其实很简单js注入就好了 localStorage_1 = driver.execute_script( ...
- 各大原厂看好MRAM发展
MRAM是一种以电阻为存储方式结合非易失性及随机访问两种特性,可以兼做内存和硬盘的新型存储介质.写入速度可达NAND闪存的数千倍,此外,其制作工艺要求低,良品率高,可以很好的控制成本.在寿命方面,由于 ...
- MY_0001:添加命令到自定义工具栏
1,按住 ctrl + shift 2,点击命令即可
- 03-React基础语法(3)
一.Context 概念:Context 提供一个无需在每层组件中添加Props,就可以实现组件组件之间通信的方法 语法: 1创建context对象 const {Provider, Consum ...
- tensorflow数据统计
本篇内容包括,tf.norm(张量的范数).tf.reduce_min/max(最大最小值).tf.argmax/argmin(最大最小值的位置).tf.equal(张量的比较).tf.unique( ...
- Pycharm有必要改的几个默认设置项
最近在用Pycharm学习Python的时候,总有两个地方感觉不是很舒服,比如调用方法的时候区分大小写(thread就不会出现Thread,string就不会出现String)等,这让我稍稍有点不舒服 ...
- javascript 权威指南一
1. JavaScript是面向web(网页)的编程语言. 2.html: 描述网页内容,css:描述网页样式,JavaScript:描述网页行为 3.JavaScript非常适合面向对象和函数式的编 ...
- kali linux中mariadb加上密码
kali自带mysql.2019.4 中带得是:MariaDB.据说跟Mysql差不多.简单用了一下发现root用户可以不要密码进入Mysql! 这极不习惯,不输入密码感觉好像少了点什么.这肯定是权限 ...
- Docker构建镜像过于缓慢解决-----Docker构建服务之部署和备份jekyll网站
参考原文链接:https://www.jianshu.com/p/e6b7e68f2ba7 来自<第一本Docker书>,我觉得很有趣,就记录一下 准备国内ubuntu镜像 每次构建Ubu ...
- PAT 基础编程题目集 6-7 统计某类完全平方数 (20 分)
本题要求实现一个函数,判断任一给定整数N是否满足条件:它是完全平方数,又至少有两位数字相同,如144.676等. 函数接口定义: int IsTheNumber ( const int N ); 其中 ...