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的更多相关文章

  1. Codeforces1234F. Yet Another Substring Reverse(状压dp)

    题目链接:传送门 思路: 由于只能翻转一次子串,就相当于找出两个不连续的子串,把在后面的一个子串翻转过来,和第一个子串拼接. 因为题目仅要求子串中的字符不重复,所以字符的先后顺序无关,翻转的操作就相当 ...

  2. 【BZOJ4560】[JLoi2016]字符串覆盖 KMP+状压DP

    [BZOJ4560][JLoi2016]字符串覆盖 Description 字符串A有N个子串B1,B2,…,Bn.如果将这n个子串分别放在恰好一个它在A中出现的位置上(子串之间可以重叠)这样A中的若 ...

  3. fzu2188 状压dp

    G - Simple String Problem Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & ...

  4. FZU - 2218 Simple String Problem(状压dp)

    Simple String Problem Recently, you have found your interest in string theory. Here is an interestin ...

  5. 【62测试】【状压dp】【dfs序】【线段树】

    第一题: 给出一个长度不超过100只包含'B'和'R'的字符串,将其无限重复下去. 比如,BBRB则会形成 BBRBBBRBBBRB 现在给出一个区间[l,r]询问该区间内有多少个字符'B'(区间下标 ...

  6. CCF 201312-4 有趣的数 (数位DP, 状压DP, 组合数学+暴力枚举, 推公式, 矩阵快速幂)

    问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次. 2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前. 3. 最高 ...

  7. bzoj 1879 [Sdoi2009]Bill的挑战(状压DP)

    Description  Input 本题包含多组数据. 第一行:一个整数T,表示数据的个数. 对于每组数据: 第一行:两个整数,N和K(含义如题目表述). 接下来N行:每行一个字符串. Output ...

  8. Codeforces 544E Remembering Strings 状压dp

    题目链接 题意: 给定n个长度均为m的字符串 以下n行给出字符串 以下n*m的矩阵表示把相应的字母改动成其它字母的花费. 问: 对于一个字符串,若它是easy to remembering 当 它存在 ...

  9. Tirp(状压DP)

    Description 有一个N*N的迷宫,其中有一些宝藏,现在,小A要从入口(1,1)出发,到达出口(N,N),每次,小A只能从当前的格子走到上下左右四个格子,为了不空手而归,小A决定要拿到所以的宝 ...

随机推荐

  1. P3902 递增

    链接:P3902 ----------------------------------------- 这道题就是最长上升子序列的模板题,因为我们修改的时候可没说不能改成小数(暴力) --------- ...

  2. CentOS7安装gotoblas遇到的问题

    1. 错误信息: /usr/lib64/gcc/x86_64-suse-linux/4.7/../../../../x86_64-suse-linux/bin/ld: cannot find -l-l ...

  3. React.js高阶函数的定义与使用

    /* 高阶函数的简单定义与使用 一: 先定义一个普通组件 二: 用function higherOrder(WrappendComponent) { return } 将组件包裹起来,并用export ...

  4. ZViZbsPBdS

    第一步:请在下方输入框中输入你要搬家的博客个人主页地址,需要注意格式: SegmentFault:https://segmentfault.com/u/xxxx 掘金:https://juejin.i ...

  5. Sass环境安装-Sass sublime 编辑器插件编译方法

    首先官网(http://www.ruby-lang.org/en/downloads/)下载 ruby (1)打开链接进入到下载页面,点击如下位置进行下载 (2)下载页面 (3)进入到各个版本的列表页 ...

  6. Ansible Tower 3.5.1 平台部署和破解

    原创 Ansible Tower 3.5.1 平台部署和破解 Ansible Tower (以前叫’AWX’)是能够帮助任何IT团队更容易使用Ansible的解决方案.该方案基于web. Tower允 ...

  7. Java第三节课总结

    动手动脑1: package ketangceshia;import java.util.Random;public class fuben {    public static void main( ...

  8. LeNet, AlexNet, VGGNet, GoogleNet, ResNet的网络结构

    1. LeNet 2. AlexNet 3. 参考文献: 1.  经典卷积神经网络结构——LeNet-5.AlexNet.VGG-16 2. 初探Alexnet网络结构 3.

  9. Disharmony Trees HDU - 3015 树状数组+离散化

    #include<cstdio> #include<cstring> #include<algorithm> #define ll long long using ...

  10. 问题 D: 八皇后

    #include <cstdio> #include <vector> #include <algorithm> using namespace std; cons ...