这题好像比较牛逼,好像又不是怎么样。

考虑两个串是如何计算 LCS 的。

这还不简单?\(dp[n][m]=\max(\max(dp[n-1][m],dp[n][m-1]),[s[n]==t[m]]dp[n-1][m-1])\)。

我们发现一件事情:\(dp[n][m]-dp[n][m-1]\leq 1\)。

接下来引入一个叫 DP 套 DP 的神秘玩意儿。

大概其实就是在 DP 的转移 DAG(或者 DFA) 上面搞事情。

我们对 \(t\) 状压,表示当前的 \(s\) 和 \(t\) 的匹配状态。

我们如果知道匹配状态是可以直接还原 dp 数组的。我们直接还原,然后枚举 \(s\) 当前是哪一个字符,然后把转移边丢出来就好了。

以及,这个转移 DAG 包含了所有可能的边。

所有我们需要做的就是枚举当前匹配状态和下一个字符,然后把转移边丢出来。

然后转移就好了。

对于 NOI,只需要额外记录当前匹配到哪个字符,再处理一下即可。

复杂度 \(O(m2^k+k2^k)\)。

#include<cstdio>
typedef unsigned ui;
const ui mod=1e9+7;
ui n,m,lim,t[20],ans[20],ppc[1<<15],trans[1<<15|1][3],f[1<<15|1][3],g[1<<15|1][3];char s[20];
ui dp[2][20];
inline ui max(const ui&a,const ui&b){
return a>b?a:b;
}
inline void Add(ui&a,const ui&b){
if((a+=b)>=mod)a-=mod;
}
inline void init(){
lim=1<<m;
for(ui i=0;i<m;++i)t[i]=s[i]=='N'?0:s[i]=='O'?1:2;
for(ui S=0;S<lim;++S){
for(ui i=0;i<m;++i)dp[0][i]=S>>i&1;
for(ui i=1;i<m;++i)dp[0][i]+=dp[0][i-1];
for(ui s=0;s<3;++s){
dp[1][0]=dp[0][0];
if(s==t[0])dp[1][0]=1;
for(ui i=1;i<m;++i){
dp[1][i]=max(dp[1][i-1],dp[0][i]);
if(s==t[i])dp[1][i]=max(dp[1][i],dp[0][i-1]+1);
}
for(ui i=1;i<m;++i)trans[S][s]|=dp[1][i]-dp[1][i-1]<<i;trans[S][s]|=dp[1][0];
}
}
}
signed main(){
scanf("%u%u%s",&n,&m,s);init();f[0][0]=1;
for(ui i=0;i<n;++i){
for(ui S=0;S<lim;++S){
if(f[S][0]){
Add(g[trans[S][0]][1],f[S][0]);
Add(g[trans[S][1]][0],f[S][0]);
Add(g[trans[S][2]][0],f[S][0]);
}
if(f[S][1]){
Add(g[trans[S][0]][1],f[S][1]);
Add(g[trans[S][1]][2],f[S][1]);
Add(g[trans[S][2]][0],f[S][1]);
}
if(f[S][2]){
Add(g[trans[S][0]][1],f[S][2]);
Add(g[trans[S][1]][0],f[S][2]);
}
}
for(ui S=0;S<lim;++S){
f[S][0]=g[S][0];f[S][1]=g[S][1];f[S][2]=g[S][2];
g[S][0]=g[S][1]=g[S][2]=0;
}
}
for(ui S=0;S<lim;++S){
ppc[S]=ppc[S>>1]+(S&1);
for(ui i=0;i<3;++i)Add(ans[ppc[S]],f[S][i]);
}
for(ui i=0;i<=m;++i)printf("%u\n",ans[i]);
}

LGP4590题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

随机推荐

  1. 样式操作案例5-改变box的大小和位置

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. go基础——变量与常量

    变量 package main import "fmt" /* 变量:variable 概念:一小块内存,用于存储数据,在程序运行过程中数值可以改变 特性:静态语言,强类型语言 * ...

  3. 【ASP.NET Core】设置 Web API 响应数据的格式——FormatFilter特性篇

    在上一篇烂文中老周已向各位介绍过 Produces 特性的使用,本文老周将介绍另一个特性类:FormatFilterAttribute. 这个特性算得上是筛选器的马甲,除了从 Attribute 类派 ...

  4. ASP.NET Core 6框架揭秘实例演示[02]:基于路由、MVC和gRPC的应用开发

    ASP.NET Core可以视为一种底层框架,它为我们构建出了基于管道的请求处理模型,这个管道由一个服务器和多个中间件构成,而与路由相关的EndpointRoutingMiddleware和Endpo ...

  5. jquery-easyui环境的搭建及测试

    对于软件开发者来说,一个良好的前端框架不仅能够使页面优美可观而且还能够大大的提高开发效率.提高系统整体界面的美观,框架将常用的功能封装完成,减少工作量.前端框架目前也比较多,小编本次主要介绍下easy ...

  6. Solution -「NOI 模拟赛」彩色挂饰

    \(\mathcal{Description}\)   给定一个含 \(n\) 个点 \(m\) 条边的简单无向图,设图中最大点双的大小为 \(s\),则保证 \(s\le6\).你将要用 \(k\) ...

  7. mysql,数据类型与表操作

    一.mysql基本认知 创建用户 create host aa identified with mysql_native_password by ''; 修改用户权限 alter user root@ ...

  8. 『无为则无心』Python面向对象 — 45、面向对象编程

    目录 1.面向对象编程的概念 2.面向对象编程和面向过程编程的区别 (1)面向过程编程 (2)面向对象编程 3.举例理解面向对象 4.Python的面向对象编程 5.面向对象的几大核心特性 1.面向对 ...

  9. [源码解析] NVIDIA HugeCTR,GPU版本参数服务器--- (4)

    [源码解析] NVIDIA HugeCTR,GPU版本参数服务器--- (4) 目录 [源码解析] NVIDIA HugeCTR,GPU版本参数服务器--- (4) 0x00 摘要 0x01 总体流程 ...

  10. react 也就这么回事 01 —— React 元素的创建和渲染

    React 是一个用于构建用户界面的 JavaScript 库 它包括两个库:react.js 和 react-dom.js react.js:React 的核心库,提供了 React.js 的核心功 ...