题意

给你一个字符串,问你操作后的最长串的最小值。

Solution:

首先考虑 dp 。由 k<=17 想到状压 dp ,但是字符集太大 2^17 ,而字符串长度 2e5 ,所以不太好直接做。

二分答案。转为判定 mid 是否成立。还是观察到 k<=17 ,考虑枚举先后匹配顺序,因为只需要匹配 k 次,时间复杂度 O(k2^k)

pos[i][j] 表示 [i,n] 匹配字符 j 的最早位置,那么可以 O(1) 转移。

但是直接枚举排列会超时。再次发挥人类智慧,用二进制来搞,复杂度就降为了 k2^k

总时间复杂度 O((k2^k+nk)logn)

总结:做 dp 题做不出来时要善于换状态,及时排除错误的模型和做法。

细节:因为这里判的是 0 ,所以 k=0 需要特判。

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define ll long long
#define PII pair<int,int>
#define All(a) a.begin(),a.end()
using namespace std;
const int mx=2e5+5;
const int mxn=(1<<17)+5;
int n,k,pos[17][mx],dp[mxn];
char s[mx];
bool check(int mid) {for(int i=0;i<k;i++) {int cnt=0;for(int j=n;j>=1;j--) {cnt=(s[j]=='a'+i||s[j]=='?')?cnt+1:0;if(cnt>=mid) pos[i][j]=j+mid-1;else pos[i][j]=pos[i][j+1];}}dp[0]=0;for(int i=1;i<(1<<k);i++) {dp[i]=INF;for(int j=0;j<k;j++) {if((i>>j)&1 && dp[i-(1<<j)]!=INF && pos[j][dp[i-(1<<j)]+1]) {dp[i]=min(dp[i],pos[j][dp[i-(1<<j)]+1]);}}}return dp[(1<<k)-1]!=INF;
}
int main() {scanf("%d%d%s",&n,&k,s+1);int l=1,r=n/k,res=0;while(l<=r) {int mid=(l+r)>>1;if(check(mid)) res=mid,l=mid+1;else r=mid-1;}printf("%d",res);
}

【题解】CF1550E Stringforces相关推荐

  1. CF1550E Stringforces

    CF1550E Stringforces 题意: 设 s 是一个由前 k 个小写字母构成的字符串,v 是前 k 个小写字母中的某一个.定义MaxLen(s,v)\mathrm{MaxLen}(s,v) ...

  2. SMSC2021 Day5Day6 部分题解

    SMSC2021 Day5&Day6 Day5 T1 矩阵 matrix (※差分) Day6 T1 旅行 travel (※差分,树上二分与倍增) T2 串串串 string (二分答案,状 ...

  3. [JS][dfs]题解 | #迷宫问题#

    题解 | #迷宫问题# 题目链接 迷宫问题 题目描述 定义一个二维数组 N*M ,如 5 × 5 数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 1, 1 ...

  4. [JS][dp]题解 | #打家劫舍(一)#

    题解 | #打家劫舍(一)# 题目链接 打家劫舍(一) 题目描述 描述 你是一个经验丰富的小偷,准备偷沿街的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家, ...

  5. [JS]题解 | #魔法数字#

    题解 | #魔法数字# 题目链接 魔法数字 题目描述 牛妹给牛牛写了一个数字n,然后又给自己写了一个数字m,她希望牛牛能执行最少的操作将他的数字转化成自己的. 操作共有三种,如下: 在当前数字的基础上 ...

  6. [JS]题解 | #岛屿数量#

    题解 | #岛屿数量# 题目链接 岛屿数量 题目描述 时间限制:1秒 空间限制:256M 描述 给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛.我们只考虑上下左右 ...

  7. [JS] 题解:提取不重复的整数

    题解:提取不重复的整数 https://www.nowcoder.com/practice/253986e66d114d378ae8de2e6c4577c1 时间限制:1秒 空间限制:32M 描述 输 ...

  8. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

  9. [洛谷1383]高级打字机 题解

    题解 这道题一看就珂以用主席树啊 这是一道神奇的题目,那么我们先敲一个主席树,然后维护一个数组len,表示下一次应该在len + 1插入, 之后对于T操作,在上一个版本的len + 1上直接执行插入 ...

最新文章

  1. linux shell $0怎么输出,linux shell中$0,$?,$!等的特殊用法
  2. mysql innodb 设置详解_【mysql】mysql innodb 配置详解
  3. Ext JS 6开发实例(一)
  4. [转]C# 将类的内容写成JSON格式的字符串
  5. Java重载遇到泛型
  6. Java服务器 dm Server
  7. Python多线程编程中daemon属性的作用
  8. Rsync服务配置详解,实现服务器间数据同步!
  9. idea进入方法快捷键详情大全(idea快捷键大全最新设置)
  10. python读取rtf文件_richtextbox怎样读取txt文件或rtf文件
  11. HDU 3533 BFS
  12. 通过HDMI获取显示器EDID数据
  13. 计算机连共享盘被禁止用户,共享文件夹无法访问、设置文件夹访问权限、共享文件夹拒绝访问的解决方法...
  14. TCP/IP:使用wireshark进行网络数据分析
  15. Intel MKL FATAL ERROR: Cannot load libmkl_avx512.so or libmkl_def.so.
  16. PageRank算法原理及代码
  17. 云服务器使用感受迥漣稅蒟羺怸遯潲佧罧障煓茹棚億辖嗔徟嚼囙
  18. AnnotatedElement
  19. 如何在群晖NAS上安装cpolar内网穿透(群晖7.X版)
  20. 计算机组装win7实训报告,计算机基础1实验报告win7基本操作.docx

热门文章

  1. iphone手机型号对应iOS系统版本及设备标签
  2. ID3 C4.5 C5.0
  3. ipad iphone开发_如何强制重启任何iPhone或iPad
  4. 逍遥模拟器过检测_BMS选用什么样的电池模拟器
  5. python中struct.unpack的用法
  6. 【IPv6+燎原系列—第7期】天气渐凉,IPv6+将如何助力天气预报?
  7. 统一推送联盟引领安卓手机迎来新时代,或将全面超越IOS
  8. catia切割红色框框_更改CATIA二维图自带的图框命令-下篇
  9. 计算机主机usb设备,手把手教你电脑出现无法识别usb设备怎么办
  10. win10使用VMware安装macOS11.1镜像系统教程