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. HTML表格概念、语法、操作、案例

    创建两行三列表格 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  2. windows下XAMPP集成环境中,MySQL数据库的使用

    https://jingyan.baidu.com/article/d169e186467a44436611d8b1.html

  3. Eclipse使用Alibaba Cloud Toolkit极速部署项目

    个人博客 地址:https://www.wenhaofan.com/a/20190716205809 什么是Alibaba Cloud Toolkit Cloud Toolkit 是针对 IDE 平台 ...

  4. MySQL系列(一):谈谈MySQL架构

    MySQL整体架构 与所有服务端软件一样,MySQL采用的也是C/S架构,即客户端(Client)与服务端(Server)架构,我们在使用MySQL的时候,都是以客户端的身份,发送请求连接到运行服务端 ...

  5. kali安装mongodb

    kali安装mongodb 1. 从官网下载需要的安装包 官网下载地址:https://www.mongodb.com/download-center/community 下载完后可以直接用xshel ...

  6. ssrf漏洞利用(内网探测、打redis)

    摘要:存在ssrf漏洞的站点主要利用四个协议,分别是http.file.gopher.dict协议. file协议拿来进行本地文件的读取,http协议拿来进行内网的ip扫描.端口探测,如果探测到637 ...

  7. Codeforces Round #624 (Div. 3)

    A.题意:通过加奇数减偶数的操作从a到b最少需要几步 签到题 #include <algorithm> #include <iostream> #include <cst ...

  8. 替换 MyEclipse 中已有的项目

    一.删除 tomcat 中的项目 1.停止 tomcat 2.删除 tomcat 中的项目 选中项目,然后右键 - Remove deployment,这个可能需要一点时间 二.删除 MyEclips ...

  9. [转]从实例谈OOP、工厂模式和重构

    有了翅膀才能飞,欠缺灵活的代码就象冻坏了翅膀的鸟儿.不能飞翔,就少了几许灵动的气韵.我们需要给代码带去温暖的阳光,让僵冷的翅膀重新飞起来.结合实例,通过应用OOP.设计模式和重构,你会看到代码是怎样一 ...

  10. ECMAScript基本语法——⑤运算符 算数运算符

    +-*/%