题意

给出两个长度为n的01字符串S和T。

选出k个字典序在S和T之间的长度为n的01字符串,使得尽可能多的字符串满足其是所选字符串中至少一个串的前缀。

这是一道思路比较奇怪的类似计数dp的题。

首先考虑如果把选出的这些串插入到一个trie树中的话,算产生的贡献可以理解为,从根节点向下画了k条长度为n的线,最大化它们所经过的点的总个数。

进一步发现,每一层节点如果不受s和t的限制的话,一定可以满足每一层都有k个点被经过。

因此,剩下要做的就是算一下这个s和t的限制,即每一层有多少个节点。

记dp[i][0/1][0/1]表示第i层,满足前i位是否与s相同,前i位是否与t相同,按照定义转移即可,复杂度O(n)。

最后统计答案的时候把每一层的节点个数和k取min后加入答案即可。

  1. #include<iostream>
  2. #include<cctype>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<string>
  6. #include<cmath>
  7. #include<ctime>
  8. #include<cstdlib>
  9. #include<algorithm>
  10. #define N 1100000
  11. #define L 1000000
  12. #define eps 1e-7
  13. #define ll long long
  14. using namespace std;
  15. inline ll read()
  16. {
  17. char ch=0;
  18. ll x=0,flag=1;
  19. while(!isdigit(ch)){ch=getchar();if(ch=='-')flag=-1;}
  20. while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
  21. return x*flag;
  22. }
  23. const ll inf=1e14+7;
  24. char s[N],t[N];
  25. ll dp[N][2][2];
  26. int main()
  27. {
  28. ll n=read(),m=read();
  29. scanf("%s",s+1);scanf("%s",t+1);
  30. dp[0][1][1]=1;
  31. for(ll i=0;i<n;i++)
  32. {
  33. if(s[i+1]==t[i+1])dp[i+1][1][1]=dp[i][1][1];
  34. else dp[i+1][1][0]=dp[i+1][0][1]=dp[i][1][1];
  35. dp[i+1][1][0]+=dp[i][1][0];
  36. dp[i+1][0][1]+=dp[i][0][1];
  37. dp[i+1][0][0]=min(2*dp[i][0][0],inf);
  38. if(s[i+1]=='a')
  39. dp[i+1][0][0]=min(dp[i+1][0][0]+dp[i][1][0],inf);
  40. if(t[i+1]=='b')
  41. dp[i+1][0][0]=min(dp[i+1][0][0]+dp[i][0][1],inf);
  42. }
  43. ll ans=0;
  44. for(ll i=1;i<=n;i++)
  45. {
  46. ll tot=0;
  47. for(ll j=0;j<=1;j++)
  48. for(ll k=0;k<=1;k++)
  49. tot=min(tot+dp[i][j][k],m);
  50. ans+=tot;
  51. }
  52. printf("%lld",ans);
  53. return 0;
  54. }

CF1083B The Fair Nut and String的更多相关文章

  1. Codeforces Round #526 (Div. 2) C. The Fair Nut and String

    C. The Fair Nut and String 题目链接:https://codeforces.com/contest/1084/problem/C 题意: 给出一个字符串,找出都为a的子序列( ...

  2. C. The Fair Nut and String 递推分段形dp

    C. The Fair Nut and String 递推分段形dp 题意 给出一个字符串选择一个序列\({p_1,p_2...p_k}\)使得 对于任意一个\(p_i\) , \(s[p_i]==a ...

  3. [CF1083B]The Fair Nut and Strings

    题目大意:在给定的长度为$n(n\leqslant5\times10^5)$的字符串$A$和字符串$B$中找到最多$k$个字符串,使得这$k$个字符串不同的前缀字符串的数量最多(只包含字符$a$和$b ...

  4. Codeforces Round #526 C - The Fair Nut and String /// 组合递推

    题目大意: 给定原字符序列 找出其中所有子序列满足 1.序列内字符都为a 2.若有两个以上的字符 则相邻两个字符在原序列中两者之间存在字符b 的数量 将整个字符序列用b分开 此时再得到每个b之间a的数 ...

  5. CF1083E The Fair Nut and Rectangles

    CF1083E The Fair Nut and Rectangles 给定 \(n\) 个平面直角坐标系中左下角为坐标原点,右上角为 \((x_i,\ y_i)\) 的互不包含的矩形,每一个矩形拥有 ...

  6. CF 1083 B. The Fair Nut and Strings

    B. The Fair Nut and Strings 题目链接 题意: 在给定的字符串a和字符串b中找到最多k个字符串,使得不同的前缀字符串的数量最多. 分析:  建出trie树,给定的两个字符串就 ...

  7. CF 1083 A. The Fair Nut and the Best Path

    A. The Fair Nut and the Best Path https://codeforces.com/contest/1083/problem/A 题意: 在一棵树内找一条路径,使得从起点 ...

  8. CF1083A The Fair Nut and the Best Path

    CF1083A The Fair Nut and the Best Path 先把边权搞成点权(其实也可以不用),那么就是询问树上路径的最大权值. 任意时刻权值非负的限制可以不用管,因为若走路径 \( ...

  9. Codeforces Round #526 (Div. 2) E. The Fair Nut and Strings

    E. The Fair Nut and Strings 题目链接:https://codeforces.com/contest/1084/problem/E 题意: 输入n,k,k代表一共有长度为n的 ...

随机推荐

  1. mysql索引使用策略及优化

    原文地址:http://blog.codinglabs.org/articles/theory-of-mysql-index.html 索引使用策略及优化 MySQL的优化主要分为结构优化(Schem ...

  2. js 数组操作

    toString():把数组转换成一个字符串 toLocaleString():把数组转换成一个字符串 join():把数组转换成一个用符号连接的字符串 shift():将数组头部的一个元素移出 un ...

  3. WireShark学习

    1.打开wireshark->Capture->Interface->选择你的网卡(选中)->Start 2.OK抓包开始,工具栏上有stop,点击停止抓包 3.过滤,这个你可 ...

  4. Linux vmstat命令实际操作介绍

    vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存.进程.CPU活动进行监控.它能够对系统的整体情况进行统计,无法对某个进程进行深入分析. ...

  5. web前端----jQuery属性操作

    知识点总结 1.属性 属性(如果你的选择器选出了多个对象,那么默认只会返回出第一个属性). attr(属性名|属性值) - 一个参数是获取属性的值,两个参数是设置属性值 - 点击加载图片示例 remo ...

  6. MySQL数据库----事务处理

    事物处理  一. 什么是事务    一组sql语句批量执行,要么全部执行成功,要么全部执行失败 二.为什么出现这种技术 为什么要使用事务这个技术呢? 现在的很多软件都是多用户,多程序,多线程的,对同一 ...

  7. MySQL数据库----表与表之间的关系

    表1 foreign key 表2 则表1的多条记录对应表2的一条记录,即多对一 利用foreign key的原理我们可以制作两张表的多对多,一对一关系 多对多: 表1的多条记录可以对应表2的一条记录 ...

  8. HCNP学习笔记之子网掩码的计算和划分详细

    0x00 子网掩码的计算 TCP/IP网间网技术产生于大型主流机环境中,它能发展到今天的规模是当初的设计者们始料未及的.网间网规模的迅速扩展对IP地址模式的威胁并不是它不能保证主机地址的唯一性,而是会 ...

  9. Python3.x:抓取百事糗科段子

    Python3.x:抓取百事糗科段子 实现代码: #Python3.6 获取糗事百科的段子 import urllib.request #导入各类要用到的包 import urllib import ...

  10. centos下nginx安装与配置

    nginx依赖以下模块: l  gzip模块需要 zlib 库 l  rewrite模块需要 pcre 库 l  ssl 功能需要openssl库 tar xzvf nginx-1.9.15.tar. ...