题目链接

大致题意为将某个子串进行翻转后,使得不包含相同字符的字符子串长度最长。只能翻转一次或零次。

设一个子串的状态为包含字符的二进制。如子串为$abacd$,则状态为$00000000000000001111$。

根据分析可以得到,一个子串和另一个子串如果没有交集,则两个串可以经过一次翻转合并在一起。

例如:$abcdefga$,串$ab$和串$fg$,可以通过翻转$cdefg$变成$abgfedca$。

所以如果枚举一个状态,再枚举这个状态的补集的子集。就可以得到合法的状态。

但是枚举子集的复杂度太大,所以我们先处理出每种合法状态有多少个字符,然后再从小到大枚举一遍状态。这样可以得到每种状态的合法子集的最大值。

然后计算答案。

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + ;
int dp[ << ], vis[];
string s;
int main() {
cin >> s;
for (int i = ; i < s.size(); i++) {
int mark = , cnt = ;
memset(vis, , sizeof(vis));
for (int j = i; j < s.size(); j++) {
if (vis[s[j] - 'a'])
break;
vis[s[j] - 'a'] = ;
mark |= ( << (s[j] - 'a'));
cnt++;
dp[mark] = cnt;
}
}
for (int i = ; i < ( << ); i++)
for (int j = ; j < ; j++)
if (i & ( << j))
dp[i] = max(dp[i], dp[i ^ ( << j)]);
int ans = ;
for (int i = ; i < ( << ); i++)
ans = max(ans, dp[i] + dp[i ^ (( << ) - )]);
printf("%d\n", ans);
}

最新文章

  1. C# 词法分析器(七)总结
  2. ruby -- 基础学习(七)时间的内置函数和格式说明
  3. nginx反向代理+缓存开启+url重写+负载均衡(带健康探测)的部署记录
  4. HoloToolkit项目源码剖析 - Spatial Mapping功能实现
  5. CoreOS
  6. 升级win10的理由
  7. pyqt QTimer,QThread例子学习
  8. Eclipse shift + ctrl + F 不好用
  9. DocFX
  10. python基础知识1---python相关介绍
  11. Apache的ServerAlias的作用
  12. 33.Odoo产品分析 (四) – 工具板块(4) – 问题追踪及群发邮件营销(1)
  13. odoo配置文件内容详解
  14. VS2015 与 Git 的简单使用
  15. java多线程中的死锁情况读书笔记
  16. PHP常用的缓存技术汇总
  17. lucene介绍
  18. CRF++ 如何制定自己的特征模板
  19. Linux 下的jdk安装
  20. HADOOP/HDFS Essay

热门文章

  1. 2、DockPanel
  2. 深入理解二阶段提交协议(DDB对XA悬挂事务的处理分析)(一)
  3. 「HEOI 2016/TJOI 2016」求和
  4. 分布式-信息方式-ActiveMQ结合Spring
  5. 整合spring之后,struts2里面的自定义拦截器的invocation.invoke()总是返回input
  6. C++入门经典-例3.21-goto语句实现循环
  7. PHP 设置Cookie值注意项
  8. java 深入HashMap
  9. 自定义view实现画个闪烁的心
  10. golang入门案例之http client请求