BZOJ5337 [TJOI2018] 碱基序列 【哈希】【动态规划】
题目分析:
这道题的难点在于要取模,而题面没有写。
容易想到一个O(1E7)的dp。KMP或者哈希得到相关位置然后对于相关位置判断上一个位置有多少种情况。
代码:
#include<bits/stdc++.h>
using namespace std; const int maxn = ; const int mod = ; int n;
string str;
string fm[][];
int num[]; const int Kh = ; struct hnum{
int base;
unsigned long long multi[];
unsigned long long hash[];
}h[]; void read(){
ios::sync_with_stdio(false);
cin.tie();
cin >> n;
cin >> str;
for(int i=;i<=n;i++){
cin >> num[i];
for(int j=;j<=num[i];j++) {cin >> fm[i][j];}
}
} long long rm[][maxn];
int d[maxn]; void KMP(int c,int m){
memset(d,,sizeof(d));
string &p = fm[c][m];
for(int o = ;o<Kh;o++){
unsigned long long now = ;
for(int i=;i<p.length();i++)
now += (p[i]-'A'+)*h[o].multi[i];
for(int i=p.length()-;i<str.length();i++){
unsigned long long data;
if(i!=p.length()-)data = h[o].hash[i]-h[o].hash[i-p.length()];
else data = h[o].hash[i];
if(now == data) d[i]++;
now = now*h[o].base;
}
}
for(int i=;i<str.length();i++) if(d[i]==Kh)d[i]=;else d[i]=;
} void build_hash(){
for(int i=;i<Kh;i++){
h[i].multi[] = ;
for(int j=;j<str.length();j++){
h[i].multi[j] = h[i].multi[j-]*h[i].base;
}
h[i].hash[] = str[]-'A'+;
for(int j=;j<str.length();j++){
h[i].hash[j] = h[i].hash[j-]+(str[j]-'A'+)*h[i].multi[j];
}
}
} void work(){
h[].base = ,h[].base = ;
build_hash();
for(int i=;i<=num[];i++){
KMP(,i); for(int k=;k<str.length();k++) rm[][k] += d[k];
}
for(int i=;i<=n;i++){
memset(rm[i&],,sizeof(rm[i&]));
for(int j=;j<=num[i];j++){
KMP(i,j); int len = fm[i][j].length();
for(int k=;k<str.length();k++){
if(d[k]){
if(k-len<) continue;
rm[i&][k] += rm[(i+)&][k-len];
rm[i&][k] %= mod;
}
}
}
}
long long ans = ;
for(int j=;j<str.length();j++){
ans += rm[n&][j]; ans %= mod;
}
printf("%lld",ans);
} int main(){
read();
work();
return ;
}
BZOJ5337 [TJOI2018] 碱基序列 【哈希】【动态规划】的更多相关文章
- UOJ#373. 【ZJOI2018】线图 搜索,树哈希,动态规划
原文链接www.cnblogs.com/zhouzhendong/p/UOJ373.html 前言 真是一道毒瘤题.UOJ卡常毒瘤++.我卡了1.5h的常数才过QAQ Orzjry 标算居然是指数做法 ...
- 洛谷P4591 [TJOI2018]碱基序列(hash dp)
题意 题目链接 Sol \(f[i][j]\)表示匹配到第\(i\)个串,当前在主串的第\(j\)个位置 转移的时候判断一下是否可行就行了.随便一个能搞字符串匹配的算法都能过 复杂度\(O(|S| K ...
- [TJOI2018]碱基序列
嘟嘟嘟 现在看到字符串就想到SAM,所以很担心kmp啥的会不会忘了-- 这题感觉挺暴力的:首先当然要把\(s\)建成SAM,然后令\(dp[i][j]\)表示到第\(i\)组时,SAM上节点\(j\) ...
- BZOJ5337 [TJOI2018]str
题意 小豆参加了生物实验室.在实验室里,他主要研究蛋臼质.他现在研究的蛋臼质是由k个氨基酸按一定顺序构成的.每一个氨基酸都可能有a种碱基序 列si_j 构成.现在小豆有一个碱基串s,小豆想知道在这个碱 ...
- 洛谷P4591 [TJOI2018]碱基序列 【KMP + dp】
题目链接 洛谷P4591 题解 设\(f[i][j]\)表示前\(i\)个串匹配到位置\(j\)的方案数,匹配一下第\(i\)个串进行转移即可 本来写了\(hash\),发现没过,又写了一个\(KMP ...
- 【[TJOI2018]碱基序列】
题目 为什么没人用\(SAM\)啊 我们先把原来的模式串建一遍\(SAM\),之后我们就可以求出\(SAM\)上每一个节点的\(|endpos|\)就可以知道每一个子串出现的次数了,也就是在模式串上的 ...
- 「学习笔记」字符串基础:Hash,KMP与Trie
「学习笔记」字符串基础:Hash,KMP与Trie 点击查看目录 目录 「学习笔记」字符串基础:Hash,KMP与Trie Hash 算法 代码 KMP 算法 前置知识:\(\text{Border} ...
- 【BZOJ5337】[TJOI2018]str(动态规划,哈希)
[BZOJ5337][TJOI2018]str(动态规划,哈希) 题面 BZOJ 洛谷 题解 就很呆... 显然按层\(dp\),如果能够匹配上就进行转移,直接哈希判断是否能够匹配就好了... #in ...
- 【BZOJ5336】[TJOI2018]party(动态规划)
[BZOJ5336][TJOI2018]party(动态规划) 题面 BZOJ 洛谷 题解 这题好神仙啊... 考虑普通的\(LCS\)的\(dp\),\(f[i][j]=\max\{f[i-1][j ...
随机推荐
- 如何在Skyline中加载ArcGISServer发布的WMS和WMTS服务
如何在Skyline中加载ArcGISServer发布的WMS和WMTS服务? 我这里的测试环境是ArcGISServer10.1和TerraExplorer Pro7.0,主要过程截图如下,
- python多版本共存问题(以2.7和3.5系列版本为例)
1.0 下载Python2.7x和Python3.5x版本 2.0 安装Python 3.0 配置环境变量,分别添加至path路径 4.0 只修改Python27文件中的.exe文件(这样系统默认为P ...
- Intellij实用技巧
快捷键 Tradition 快捷键 介绍 Ctrl + Z 撤销 Ctrl + Shift + Z 取消撤销 Ctrl + X 剪切 Ctrl + C 复制 Ctrl + S 保存 Tab 缩进 Sh ...
- (转)对一个deb包的解压、修改、重新打包全过程方法
转自:https://blog.csdn.net/yygydjkthh/article/details/36695243 Reference: http://www.debian.org/doc/ma ...
- Ionic 图片延时加载
图片的延时加载是为了提供App的运行效率,那么是如何实现的呢?献上github: https://github.com/paveisistemas/ionic-image-lazy-load 1.下 ...
- webpackt入门1:webpack介绍&webpack安装&使用webpack打包
本篇博客不是原创,简书的zhangwang写的,原文太长,我这里只是提取了一部分. 原文地址:入门webpack,看这篇就够了 一.Webpack解决了什么问题 问题1.JavaScript这个脚本化 ...
- [BZOJ2125]最短路[圆方树]
题意 给定仙人掌,多次询问两点之间的最短路径. \(n\le 10000, Q\le 10000\) 分析 建出圆方树,分路径 lca 是圆点还是方点讨论. 预处理出根圆点到每个圆点的最短距离 \( ...
- Ionic 2 官方示例程序 Super Starter
原文发表于我的技术博客 本文分享了 Ionic 2 官方示例程序 Super Starter 的简要介绍与安装运行的方法,最好的学习示例代码,项目共包含了 14 个通用的页面设计,如:引导页.主页面详 ...
- C_数据结构_链式二叉树
# include <stdio.h> # include <malloc.h> struct BTNode { int data; struct BTNode * pLchi ...
- Linux内核分析——可执行程序的装载
链接的过程 首先运行C预处理器cpp,将C的源程序(a.c)翻译成ASCII码的中间文件(a.i) 接着C编译器ccl,将a.i翻译成ASCII汇编语言文件a.s 接着运行汇编器as,将a.s翻译成可 ...