题目链接:点击查看

题目大意:给出一个长度为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. sqlalchemy中的first_or_404()和get_or_404()使用(前端页面可视化操作——查询和添加)
  2. 做科研已经很辛苦了,为什么还要做PPT汇报?
  3. Paxos算法之旅(四)zookeeper代码解析--转载
  4. php 多选的 二进制,PHP二进制操作初体验
  5. java性能分析与问题定位 实战
  6. 用Java读取/写入压缩和非压缩文件
  7. docker mysql主从_使用docker 实现MySQL主从同步/读写分离
  8. python遍历二维数组_在Python中遍历二维数组?
  9. Java并发编程(07):Fork/Join框架机制详解
  10. 如何系统自学python_如何系统地自学 Python?
  11. python的workbook_python openpyxl 操作 excel
  12. python中pprint是干什么的_Python中的pprint折腾记
  13. C# Linq以及反射总结
  14. 深入浅出 Javascript API(一)--基本框架
  15. 牛客小白月赛17 - J - 计数(组合数学隔板法)
  16. 好豆直播功能需求分析与优先级排序
  17. [CTF]Brainfuck/Ook!编码
  18. QQ空间说说刷赞网页版开放公测
  19. Perl 中关于 LWP::UserAgent等模块用法
  20. P6857 梦中梦与不再有梦

热门文章

  1. MySQL 高级 - 索引 - 概述
  2. 使用Nginx代理和转发Websocket连接
  3. Spring5各模块之间的依赖关系
  4. web服务器软件_概述
  5. 多线程——线程的生命周期
  6. 【面向过程编程】零钱通项目
  7. 零基础自学java的难处_零基础自学Java 在学习中要注意哪些问题
  8. win32 输出文字时清除之前的_努力学习没效果?3个步骤,强化沟通输出,实现飞跃式成长...
  9. jsp页面模块的来源
  10. Linux系统下不同机器之间拷贝文件的方法