题目链接

https://atcoder.jp/contests/agc024/tasks/agc024_f

题解

考虑对每个串都求出它是几个给定的串的子序列。
在 \(O(4^n)\) 暴力的基础上考虑优化,状态可以进行如下的压缩:用有序 01 字符串对 \((S,T)\) 代表当前已有字符串 \(S\), 后面还需要加字符串 \(T\). 转移就枚举下一个选的是什么即可。
可以发现转移是一个DAG,并且每条路径对应的字符串不同。因此直接在DAG上进行路径计数即可。
时间复杂度 \(O(2^nn)\).

代码

#include<bits/stdc++.h>
#define llong long long
#define mkpr make_pair
#define riterator reverse_iterator
using namespace std;inline int read()
{int x = 0,f = 1; char ch = getchar();for(;!isdigit(ch);ch=getchar()) {if(ch=='-') f = -1;}for(; isdigit(ch);ch=getchar()) {x = x*10+ch-48;}return x*f;
}const int N = 20;
char a[(1<<N+1)+3];
int f[(1<<N+1)+3][N+3];
int bitcnt[(1<<N+1)+3],lg2[(1<<N+1)+3];
int nxt[(1<<N+1)+3][2],cnt[(1<<N+1)+3];
int n,m;int main()
{for(int i=1; i<(1<<N+1); i++) bitcnt[i] = bitcnt[i>>1]+(i&1);lg2[1] = 0; for(int i=2; i<(1<<N+1); i++) lg2[i] = lg2[i>>1]+1;scanf("%d%d",&n,&m);for(int i=0; i<=n; i++){scanf("%s",a); for(int j=0; j<(1<<i); j++) f[j|(1<<i)][0] = a[j]-48;}for(int i=1; i<(1<<n+1); i++){int len = lg2[i]; int sta = i^(1<<len);for(int x=0; x<2; x++){nxt[i][x] = -1;for(int j=len-1; j>=0; j--){if(((i>>j)&1)==x) {nxt[i][x] = (i&((1<<j)-1))|(1<<j); break;}}
//          printf("nxt[%d][%d]=%d\n",i,x,nxt[i][x]);}}for(int j=0; j<=n; j++){for(int i=(1<<j); i<(1<<n+1); i++){int len = lg2[i]; int sta = i^(1<<len);if(f[i][j]==0) continue;cnt[i>>len-j] += f[i][j];for(int x=0; x<2; x++){if(nxt[(sta&((1<<len-j)-1))|(1<<len-j)][x]==-1) continue;int sta2 = nxt[(sta&((1<<len-j)-1))|(1<<len-j)][x],len2 = lg2[sta2]; sta2 ^= (1<<len2);sta2 |= (((i>>len-j)<<1|x)<<len2);
//              printf("(%d,%d)+%d->(%d,%d)\n",i,j,x,sta2,j+1);f[sta2][j+1] += f[i][j];}}}int ans = 0;for(int i=1; i<(1<<n+1); i++){
//      printf("cnt[%d]=%d\n",i,cnt[i]);if(cnt[i]>=m){if(lg2[i]>lg2[ans]||(lg2[i]==lg2[ans]&&i<ans)) {ans = i;}}}int len = lg2[ans]; for(int i=len-1; i>=0; i--) printf("%d",(ans>>i)&1); puts("");return 0;
}

AtCoder AGC024F Simple Subsequence Problem (字符串、DP)相关推荐

  1. agc024F Simple Subsequence Problem

    agc024F Simple Subsequence Problem 给若干个01串,求一个最长的01串使得它是至少 m m m个给出01串的子序列. 在长度最长的情况下求输出字典序最小的01串. ∣ ...

  2. [OI]字符串DP小结

    顾名又思义,是在字符串上进行的DP操作.因为字符串本身可以看作是一个序列,所以有些时候字符串DP可以用区间DP来解决. P2246 SAC#1 - Hello World(升级版) 题目描述 在讲义的 ...

  3. BZOJ 3489: A simple rmq problem

    3489: A simple rmq problem Time Limit: 40 Sec  Memory Limit: 600 MB Submit: 1594  Solved: 520 [Submi ...

  4. FZYZ-2071 A Simple Math Problem IX

    P2071 -- A Simple Math Problem IX 时间限制:1000MS      内存限制:262144KB 状态:Accepted      标签:    数学问题-博弈论    ...

  5. A Simple Math Problem(2020 ICPC 江西省省赛)

    A Simple Math Problem ∑i=1n∑j=1if(j)[gcd(i,j)=1]∑i=1n∑j=inf(i)[gcd(i,j)=1]∑i=1n∑j=1nf(i)[gcd(i,j)=1] ...

  6. BZOJ3489 A simple rmq problem 【可持久化树套树】*

    BZOJ3489 A simple rmq problem Description 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过一 ...

  7. java字符串匹配dp_[OI]字符串DP小结

    顾名又思义,是在字符串上进行的DP操作.因为字符串本身可以看作是一个序列,所以有些时候字符串DP可以用区间DP来解决. P2246 SAC#1 - Hello World(升级版) 题目描述 在讲义的 ...

  8. 【BZOJ3489】A simple rmq problem kd-tree

    [BZOJ3489]A simple rmq problem Description 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过 ...

  9. A Simple Math Problem 矩阵打水题

    A Simple Math Problem Lele now is thinking about a simple function f(x). If x < 10 f(x) = x. If x ...

最新文章

  1. Python爬虫入门教程 21-100 网易云课堂课程数据抓取
  2. EventHandler, EventArgs
  3. JSON、Protobuf、Thrift、MessagePack 对比和开发指南
  4. 隔行变色java代码_jquery入门—选择器实现隔行变色实例代码
  5. 【LeetCode】查找只出现一次的数字算法
  6. Python笔记-weditor的安装及基本使用
  7. Memcache安全性
  8. 色彩专题——蓝色(blue)_8号招牌档
  9. Android Support Library 23.2更新啦
  10. 5.Jenkins 权威指南 --- 安全
  11. 怎么做分布式存储的面试?
  12. 三星s9Android9内测申请链接,Galaxy S9/S9+国行版进行安卓9.0内测
  13. JS表单验证之正则表达式
  14. input限制上传数量,规定图片上传数量
  15. 如何为你的网站植入广告,赚取收益呢GoogleAdsense首选
  16. 苹果硬改手机底层udid无限新机技术
  17. 3Dmax对齐轴点到其他对象
  18. 32位和64位操作系统与System,System32,Syswow64的区别
  19. 如何设计领导可视化驾驶舱?分享多行业通用方法论
  20. oracle怎么分组查重,2021-04-02 大文本文件数据查重

热门文章

  1. 学长毕业日记 :本科毕业论文写成博士论文的神操作
  2. 利用ajax赋值,jquery利用async在ajax中给全局变量赋值
  3. 关于控制台程序的一些想法
  4. sql字符串分隔函数
  5. C++成员函数指针的另类调用方法
  6. FFmpeg音视频入门-使用FFmpeg读取多媒体文件的信息C++代码实现+详解
  7. P4 详解各硬件部分
  8. next() 与 nextLine() 区别
  9. python 图片上传到minio时,在minio不是显示图片格式
  10. STM32开发 -- L3GD20H陀螺仪开发详解