题目链接:点击查看

题目大意:给出一个长度为n,含有k个不同字母的字符串,我们的任务是从中挑选出两段连续的子串,要求其长度的乘积最大,还有一个限制条件是,这两个子串不能互相包含相同的字母

题目分析:因为k给的特别小,我们可以用状态压缩来解决,可是,我太弱了,根本没思路,还是借鉴的大佬的思路,用异或运算来实现状态转移,具体的看代码吧,这是这两天以来写过的最短的代码了。。

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<cmath>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=(1<<16)+10; int dp[N];//记录相应状态的区间长度int main()
{
//  freopen("input.txt","r",stdin)int w;cin>>w;while(w--){int n,k;scanf("%d%d",&n,&k);string str;cin>>str;memset(dp,0,sizeof(dp));//初始化所有状态为0for(int i=0;i<str.size();i++)//区间起点{int val=0;for(int j=i;j<str.size();j++)//区间终点{val|=(1<<(str[j]-'a'));//如果区间中出现了某种字母,对其进行记录dp[val]=max(dp[val],j-i+1);//对所有区间长度进行对应的记录}}for(int i=0;i<(1<<k);i++)//这里是用子状态来更新状态,遍历所有的状态for(int j=0;j<k;j++)//在遍历所有的字母if(i&(1<<j))//如果该字母属于本次状态,则取异或,可以得到除掉该字母外的子状态
//举个例子:比如10110这个状态,他包含了10100等等状态,而10100又包含了10000和00100两个状态
//那如何用异或处理呢?还是用10110这个状态来讲,我们检测到第一个1属于这个状态之中,那么我们接下来
//用10000和10110来异或,结果恰好是00110,便是除去第一个1后的状态,然后遍历到第二个1,就是
//00100和10110取异或,结果是10010,也是去掉了第二个1后的状态,通过这样可以遍历所有子状态,达到
//更新的目的,不得不说,这个转移方程真的是太强了dp[i]=max(dp[i],dp[i^(1<<j)]);//转移方程int ans=0;for(int i=0;i<(1<<k);i++)ans=max(ans,dp[i]*dp[i^((1<<k)-1)]);//记录每个状态和它补集状态区间长度的乘积cout<<ans<<endl;}return 0;
}

FZU - 2218 Simple String Problem(状压dp)相关推荐

  1. CF11D A Simple Task(状压DP)

    \(solution:\) 思路大家应该都懂: 状压DP:\(f[i][j]\),其中 \(i\) 这一维是需要状压的,用来记录19个节点每一个是否已经走过(走过为 \(1\) ,没走为 \(0\) ...

  2. CF11D-A Simple Task【状压dp】

    正题 题目链接:https://www.luogu.com.cn/problem/CF11D 题目大意 给出nnn个点mmm条边的一张简单无向图,求它的简单环的个数. 1≤n≤191\leq n\le ...

  3. FZU-2218 Simple String Problem(状态压缩DP)

    原题地址: 题意: 给你一个串和两个整数n和k,n表示串的长度,k表示串只有前k个小写字母,问你两个不含相同元素的连续子串的长度的最大乘积. 思路: 状态压缩DP最多16位,第i位的状态表示第i位字母 ...

  4. 【校内互测】Sunshine’s string(merge) (状压dp)

    Sunshine's string(merge.cpp) [问题描述] 无聊的Sunshine大爷开始研究字符串.他找来了一个长度为n的01字符串,并制定了一些规则:每次可以将k个字符合并,得到一个新 ...

  5. 【思维题 状压dp】APC001F - XOR Tree

    可能算是道中规中矩的套路题吧-- Time limit : 2sec / Memory limit : 256MB Problem Statement You are given a tree wit ...

  6. CodeForces - 1550E Stringforces(二分+状压dp)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的字符串,只包含前 kkk 个小写字母以及通配符 ???,现在可以将通配符替换成任意的前 kkk 个字母中的一个.设 f[i]f[i]f[i] 为 ...

  7. 【2019牛客暑期多校训练营(第五场)- E】independent set 1(最大独立集,状压dp)

    题干: 链接:https://ac.nowcoder.com/acm/contest/885/E 来源:牛客网 Note: For C++ languages, the memory limit is ...

  8. Codeforces Beta Round #8 C. Looking for Order 状压dp

    题目链接: http://codeforces.com/problemset/problem/8/C C. Looking for Order time limit per test:4 second ...

  9. [SGU223]Little Kings(状压DP)

    题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=223 题意:n*n个格子里放k个王(走相邻8个格子),问不互相碰到的放法一共多少个. ...

最新文章

  1. Haproxy+keepalived高可用代理服务
  2. centos 重装 php5,centos6.6学习笔记:安装PHP5.5
  3. 图标和文字跟着div比例放大缩小_电脑桌面图标变大了?与这3个原因有关,修改后可恢复...
  4. SAP Commerce的Site列表
  5. SQLite学习总结(1)——SQLite简介及快速入门
  6. TIOBE 5 月编程语言排行榜:Python、C++ 竞争白热化,Objective-C 已沦为小众语言
  7. Docker实践 -- 安装Docker
  8. 【2019年中总结】五种途径对接天猫精灵音响控制您的智能设备,打破传统产业,让语音AI控制无处不在!
  9. python查火车票_Python查询火车票(三)
  10. 芯片级维修学习课程安排
  11. 从818悟空榜看苏宁全场景零售的数据赋能
  12. 新Word文档借用旧文档的部分样式
  13. 计算机毕业设计ssm基于Andriod的剪纸艺术平台3swaq系统+程序+源码+lw+远程部署
  14. SSH安全策略–指定IP登陆
  15. Python Tkinter——数字拼图游戏详解版
  16. 计算机上如何保存ico格式,PS怎么保存ico格式
  17. Java小白到到大佬路线
  18. Cocos Creator用cc.loader加载预制体资源和删除预制体资源
  19. 浙江查获5000余张假火车票 系跨省家族式作案网上交易
  20. 当前开源的SLAM方案汇总2021.02

热门文章

  1. MySQL高级 - 内存优化 - MyISAM内存优化
  2. 简单了解RestTemplate消息读取的转化
  3. 单体架构到微服务架构的带来的变化
  4. MyBatis 源码解读-获得Mapper 对象
  5. 函数式接口作为方法的返回值
  6. SpringMVC的请求-获得请求参数-获得基本类型参数
  7. URLClassLoader的使用
  8. 用循环求出1-100之间的偶数和
  9. 命令提示符_基本介绍
  10. flume案例-文件数据采集-步骤分析