[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决定要拿到所以的宝 ...
随机推荐
- nginx解决服务器宕机、解决跨域问题、配置防盗链、防止DDOS流量攻击
解决服务器宕机 配置nginx.cfg配置文件,在映射拦截地址中加入代理地址响应方案 location / { proxy_connect_timeout 1; proxy_send_timeout ...
- ES6数组去重方法
Set实例的方法分为两大类:操作方法(用于操作数据)和遍历方法(用于遍历成员),操作方法有:add(value).delete(value).has(value).clear():遍历方法有:keys ...
- 在eclipse中JS页面创建后<%@ page此处就马上就报错
修改路径:右键点击创建的jsp页面--->Build Path--->Configure Build Path---> Libraries--->Add Libraries-- ...
- GSS 系列题解
GSS GSS1 随便猫树或者线段树,就可以过了 猫树不说,线段树可以维护左边最大,右边最大,区间最大,区间值然后就做出来了. //Isaunoya #pragma GCC optimize(2) # ...
- react 中 函数bind 和箭头函数
用bind形式 方便测试,含有this时候最好用bind形 其他情况用箭头函数 含有this的时候也可以用箭头函数
- gulp常用插件之rev-del使用
更多gulp常用插件使用请访问:gulp常用插件汇总 rev-del这是一款从模块(如gulp-rev)生成的修订清单中删除旧的.未使用的指纹文件. 更多使用文档请点击访问rev-del工具官网. 安 ...
- sql注入文件写入和读取
系统固定文件路径:https://blog.csdn.net/ncafei/article/details/54616826 /etc/passwd c:/windows/win.ini 文件读取使用 ...
- idea中如何配置git以及在idea中初始化git,并push到码云
一.给idea配置git 打开IDEA,按照路径 Fie-->Settings --> Tools -->Terminal 找到后设置右边的Shell path(自己安装的Git路 ...
- exe 发布为服务
参考连接: https://www.cnblogs.com/liuxiaoji/p/8016261.html 1.有两个文件 srvany.exe,instsrv.exe 然后放到指定的文件下下: 2 ...
- 小白的java学习之路 “ 字符串”
定一个字符串可以使用string类和stringbuffer类. string类提供了大量的操作字符串的方法,常用的如下: 获得字符串的长度: length(). 比较字符串:equals(). 链接 ...