题意:求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. Mysql事务学习笔记

    Mysql事务学习笔记 1.事务概述 事务是数据库的执行单元,它包含了一条或多条sql语句,进行的操作是要么全部执行,要么全部都不执行. 2.事务执行命令 语法格式: start transactio ...

  2. Vultr账户充值需要注意的事项

    一.Vultr充值注意事项 1.选择适合自己的充值工具.我们可以使用支付宝.信用卡.PAYPAL等支付方式,需要我们注意的是充值方式不要来回切换充值,如果我们有多账户的时候一定不要相互使用,以免导致账 ...

  3. Linux下安装.NETCore3.0

    今天把.NETCore从2.2升到3.0记录一下 Download .NET Core 3.0  :https://dotnet.microsoft.com/download/dotnet-core/ ...

  4. scala中的闭包

    scala闭包 代码示例: package test.close_pack import scala.collection.mutable.ArrayBuffer /** * AUTHOR Guozy ...

  5. js数组中对象去重 (reduce() 方法)

    一个数组中含有对象,并且去掉数组中重复的对象.主要代码如下: var arrData = [ {id: , name: "小明"}, {id: , name: "小张&q ...

  6. tesseract-ocr,tesseract,pytesseract在windows下怎么安装

    废话不多说,直接介绍如何下载安装tesseract-OCR以及pytesseract和PIL资源 文末百度网盘都有Tesseract是一个开源的OCR引擎,能识别100多种语言(中,英,韩,日,德,法 ...

  7. BZOJ 1697: [Usaco2007 Feb]Cow Sorting牛排序(置换+贪心)

    题面 Description 农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便于行动.因为脾气大的牛有可能会捣乱,JOHN想把牛按脾气的大小排序.每一头牛的脾气都 ...

  8. 水一帖:快速计算ceil(a/b)的方式

    今天拍脑袋想出来的,不用ceil函数,不用浮点运算,不用取模,兼顾运行常数和代码量的向上取整除方法 在保证a,b>0时 ceil(a/b)=(a-1)/b+1; (完)

  9. CodeForces-1215C-Swap Letters-思维

    Monocarp has got two strings ss and tt having equal length. Both strings consist of lowercase Latin ...

  10. Codeforces 1168A Increasing by Modulo

    题目链接:http://codeforces.com/problemset/problem/1168/A 题意:给一个数组,数组中元素范围为0~n,每次你可以选择若干元素进行(ai+1)%m的操作,问 ...