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

考虑两个串是如何计算 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. python基础1-类属性和实例属性

    类属性就是类对象所拥有的属性,它被所有类对象的实例对象所共有,在内存中只存在一个副本,这个和C++中类的静态成员变量有点类似.对于公有的类属性,在类外可以通过类对象和实例对象访问 类属性 class ...

  2. iOS团队代码规范

    iOS团队代码规范 工程之始可能需要的工具: 1.使用CocoaPods类库管理工具.CocoaPods安装和使用教程. 2.下载安装注释插件VVDocumenter-Xcode. 一.项目结构管理 ...

  3. nginx的优化和防盗链

    nginx的优化和防盗链 目录 nginx的优化和防盗链 一.nginx的优化 1. 隐藏版本号 (1)隐藏版本号的原因 (2)查看版本号的方法 (3)隐藏方法一:修改配置文件 (4)隐藏方法二:修改 ...

  4. go基础——切片slice

    package main import "fmt" /* 切片: 不定长的数组,是引用类型的数据,指向一个底层数组. */ func main() { //切片的创建和访问 var ...

  5. C++输入多行数据

    动机 编程题常用需求,比如输入两行数据. 解决思路:使用getline 程序 #include <iostream> #include <vector> #include &l ...

  6. spring security中当已登录用户再次访问登录界面时,应跳转到home

    @RequestMapping("/login") public String login(){ Authentication auth = SecurityContextHold ...

  7. Solution -「洛谷 P4389」付公主的背包

    \(\mathcal{Description}\)   Link.   容量为 \(n\),\(m\) 种物品的无限背包,求凑出每种容量的方案数,对 \(998244353\) 取模.   \(n,m ...

  8. 暑假撸系统1-先把git后悔药准备好!

    学校规定让暑假自己撸一款在线考试系统,其实的确需要一个款在线的考试系统系统,因为平时学校是使用Excel讲解选择题的.基于这个目标那么就话不多说.开干! 本来趁着项目想练练手,使用些新学习的技能看看, ...

  9. 这个杀手不太冷-kill家族

    文章目录 kill killall pkill 跑路小技巧 kill家族: kill: # 删除执行中的程序或工作 killall: # 使用进程的名称来杀死进程,使用此指令可以杀死一组同名进程 pk ...

  10. [WPF] 使用 Effect 玩玩阴影、内阴影、 长阴影

    最近在学习怎么用 Shazzam Shader Editor 编写自定义的 Effect,并试着去实现阴影.内阴影和长阴影的效果.结果我第一步就放弃了,因为阴影用到的高斯模糊算法对我来说太太太太太太太 ...