题意:求NOI的合法串。。。

思路:

首先这个似乎和后缀自动机没关系(话说TJ不考后缀自动机??),其实就是一个\(DP\)套\(DP\),考虑如果不看兑奖串就是一个LCS,当出现时多记一维即可。

#include <bits/stdc++.h>
using namespace std;
const int maxn = 100010;
const int mod = 1e9+7;
int bit[maxn];
int t[maxn][3];
int dp[21];
int g[21];
int f[2][maxn][3][3];
int ans[21];
int n,m;
int k;
int a[21];
char s[21];
int nw = 1;
int nxt;
inline int read() {
int q=0,f=1;char ch = getchar();
while(!isdigit(ch)) {
if(ch=='-') f = -1;ch = getchar();
}
while(isdigit(ch)) {
q=q*10+ch-'0';ch = getchar();
}
return q*f;
}
inline void upd(int &x,int y) {
x += y;
if(x >= mod) x -= mod;
} int main () {
m = read(),n = read();
scanf("%s",s+1);
int lim = (1 << n);
for(int i = 1;i < lim; ++i) {
bit[i] = bit[i >> 1] + (i & 1);
}
for(int i = 1;i <= n; ++i) {
if(s[i] == 'N') a[i] = 0;
if(s[i] == 'O') a[i] = 1;
if(s[i] == 'I') a[i] = 2;
}
for(int k = 0;k < lim; ++k) {
for(int i = 1;i <= n; ++i) {
dp[i] = dp[i - 1] + (k >> (n - i) & 1);
}
for(int i = 0;i < 3; ++i) {
for(int j = 1;j <= n; ++j) {
if(i == a[j]) {
g[j] = dp[j - 1] + 1;
}
else g[j] = max(g[j - 1],dp[j]);
}
for(int j = 1;j <= n; ++j) {
if(g[j] == g[j - 1] + 1) {
t[k][i] |= 1 <<n - j;
}
}
}
}
f[0][0][0][0] = 1;
for(int i = 1;i <= m; ++i) {
swap(nw,nxt);
for(int j = 0;j < lim; ++j) {
memset(f[nxt][j],0,sizeof(f[nxt][j]));
}
if(i <= 2) {
for(int j = 0;j < lim; ++j) {
for(int k = 0;k < 3; ++k) {
for(int l = 0;l < 3; ++l) {
if(f[nw][j][k][l])
for(int r = 0;r < 3; ++r) {
upd(f[nxt][t[j][r]][l][r],f[nw][j][k][l]);
}
}
}
}
}
else {
for(int j = 0;j < lim ;++j) {
for(int k = 0;k < 3; ++k) {
for(int l = 0;l < 3; ++l) {
if(f[nw][j][k][l]) {
int res = f[nw][j][k][l];
for(int r = 0;r < 3; ++r) {
if(!k && l == 1 && r == 2) continue;
upd(f[nxt][t[j][r]][l][r],res);
}
}
}
}
}
}
}
for(int i = 0;i < lim; ++i) {
for(int j = 0;j < 3; ++j) {
for(int k = 0;k < 3 ; ++k) {
upd(ans[bit[i]],f[nxt][i][j][k]);
}
}
}
for(int i = 0;i <= n; ++i) printf("%d\n",ans[i]);
return 0;
}

[TJOI 2018]游园会的更多相关文章

  1. 「TJOI 2018」游园会 Party

    「TJOI 2018」游园会 Party 题目描述 小豆参加了 \(NOI\) 的游园会,会场上每完成一个项目就会获得一个奖章,奖章只会是 \(N, O, I\) 的字样. 在会场上他收集到了 \(K ...

  2. 「TJOI 2018」教科书般的亵渎

    「TJOI 2018」教科书般的亵渎 题目描述 小豆喜欢玩游戏,现在他在玩一个游戏遇到这样的场面,每个怪的血量为 \(a_i\) ,且每个怪物血量均不相同, 小豆手里有无限张"亵渎" ...

  3. [TJOI 2018]智力竞赛

    Description 题库链接 给出一张 \(m\) 个点的有向图.问可重最小路径覆盖是否 \(\leq n+1\) .若不,求最多用 \(n+1\) 条路径去覆盖,最大化未覆盖点点权最小值. \( ...

  4. [TJOI 2018] XOR

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=5338 [算法] 首先对这棵树进行树链剖分 那么我们就将一个树上的问题转化为一个序列上 ...

  5. 【TJOI 2018】数学计算

    [题目链接] 点击打开链接 [算法] 线段树维护区间乘积 [代码] #include<bits/stdc++.h> using namespace std; #define MAXQ 10 ...

  6. 2018. The Debut Album

    http://acm.timus.ru/problem.aspx?space=1&num=2018 真心爱过,怎么能彻底忘掉 题目大意: 长度为n的串,由1和2组成,连续的1不能超过a个,连续 ...

  7. Math.abs(~2018),掌握规律即可!

    Math.abs(~2018) 某前端群的入门问题长姿势了,一个简单的入门问题却引发了我的思考,深深的体会到自己在学习前端技术的同时忽略遗忘了一些计算机的基础知识. 对于 JS Math对象没什么可说 ...

  8. bzoj-3170 3170: [Tjoi 2013]松鼠聚会(计算几何)

    题目链接: 3170: [Tjoi 2013]松鼠聚会 Time Limit: 10 Sec  Memory Limit: 128 MB Description 有N个小松鼠,它们的家用一个点x,y表 ...

  9. BZOJ3170: [Tjoi 2013]松鼠聚会

    3170: [Tjoi 2013]松鼠聚会 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 531  Solved: 249[Submit][Statu ...

随机推荐

  1. Swift与OC混合开发

    一.Swift调用OC 1. 创建{targetName}-Bridging-Header.h头文件,在BuildSetting -> bridging 2. Swift文件调用的OC中的类的头 ...

  2. Linux 进程间通信 共享内存

    1.特点: 1)共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,而不需要任何数据的拷贝.如管道当在内核空间创建以后,用户空间需要内存  拷贝,需要拷贝数据,所以效率低. 2)为了在多个进 ...

  3. 笔记41 Spring Web Flow——Demo

    订购披萨的应用整体比较比较复杂,现拿出其中一个简化版的流程:即用户访问首页,然后输入电话号(假定未注册)后跳转到注册页面,注册完成后跳转到配送区域检查页面,最后再跳转回首页.通过这个简单的Demo用来 ...

  4. leetcode-第11场双周赛-5089-安排会议日程

    题目描述: 自己的提交: class Solution: def minAvailableDuration(self, slots1: List[List[int]], slots2: List[Li ...

  5. scala对象简单记录

    object Person { private val eyeNum = 2 def getEyeNum = eyeNum def main(args: Array[String]): Unit = ...

  6. 【归档】Mysql大表归档

    作为一个企业或者DBA,我们通常会有这种想法,数据是一个公司的核心命脉,应该需要永久保存,很多时候DBA和开发沟通的时候,开发人员也会这么告诉我们,这份数据非常重要,数据需要永久保存.然而,如果将数据 ...

  7. thinkphp 防止XSS(跨站脚本攻击)

    XSS(跨站脚本攻击)可以用于窃取其他用户的Cookie信息,要避免此类问题,可以采用如下解决方案: 直接过滤所有的JavaScript脚本: 转义Html元字符,使用htmlentities.htm ...

  8. PHP mysqli_affected_rows() 函数

    实例 从不同的查询中输出所影响记录行数: <?php // 假定数据库用户名:root,密码:123456,数据库:RUNOOB $con=mysqli_connect("localh ...

  9. NX二次开发-对话框解锁UF_UI_unlock_ug_access

    VC/MFC调用UG Dialog要进入加锁状态 加锁 UF_UI_lock_ug_access ( UF_UI_FROM_CUSTOM ); 此处为UF_UI_select的函数 解锁 UF_UI_ ...

  10. Dll注入技术之注册表注入

    DLL注入技术之REG注入 DLL注入技术指的是将一个DLL文件强行加载到EXE文件中,并成为EXE文件中的一部分,这样做的目的在于方便我们通过这个DLL读写EXE文件内存数据,(例如 HOOK EX ...