题意:求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. 文件IO 例子

    例子1: 测试最多打开多少个文件 #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> # ...

  2. 【Codeforces Round #429 (Div. 2) B】 Godsend

    [Link]:http://codeforces.com/contest/841/problem/B [Description] 两个人轮流对一个数组玩游戏,第一个人可以把连续的一段为奇数的拿走,第二 ...

  3. hadoop的基准测试

    hadoop的基准测试 实际生产环境当中,hadoop的环境搭建完成之后,第一件事情就是进行压力测试,测试我们的集群的读取和写入速度,测试我们的网络带宽是否足够等一些基准测试 测试写入速度 向HDFS ...

  4. NX二次开发-UFUN所有对象类型的宏定义

    /**************************************************************************** Copyright (c) 2010 Sie ...

  5. (转)使用Apache的ab工具进行压力测试

    转:http://www.cnblogs.com/luckyliu/archive/2012/03/04/2379306.html Apache附带的ab工具(本机使用的PHP环境是WAMP集成环境, ...

  6. mysql删除字段为null的数据

    delete FROM main_bussiness_cost1 where date is null; 不能用 date = null:

  7. Python 数据结构_堆栈

    目录 目录 堆栈 堆栈 堆栈是一个后进先出(LIFO)的数据结构. 堆栈这个数据结构可以用于处理大部分具有后进先出的特性的程序流 . 在堆栈中, push 和 pop 是常用术语: push: 意思是 ...

  8. Python环境出现模块找不到

    由于上周脚受伤了,修养了几天没有学习.今天去实验室发现我的编译器跑不动了,出现找不到模块的情况,很奇怪都安装了,也不会提示什么模块找不到. 查找了些资料,发现是因为某个模块的文件损坏或者被覆盖或者安装 ...

  9. js实现下拉框

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

  10. _IRP struct

    Windows XP x86 +0x000 Type : Int2B +0x002 Size : Uint2B +0x004 MdlAddress : Ptr32 _MDL +0x000 Next : ...