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 ...
随机推荐
- php和js字符串的acsii码函数
简单普及下编码知识: javascript中有charCodeAt(),根据字符查找ascii码. String.fromCharCode(),根据ascii码查找对应的字符. console.log ...
- odoo学习之弹框显示
按条件隐藏: <xpath expr="//group[1]" position="attributes"> <attribute name= ...
- 【vue】chrome已安装Vue Devtools在控制台却无显示
chrome已安装Vue Devtools在控制台却无显示的解决: 在点亮Vue Devtools图标后,控制台没有vue解读显示. 原因:脚手架配置NODE_ENV直接定义为了production版 ...
- linux中fork, source和exec的区别
转:linux中fork, source和exec的区别 shell的命令可以分为内部命令和外部命令. 内部命令是由特殊的文件格式.def实现的,如cd,ls等.而外部命令是通过系统调用或独立程序实现 ...
- Python从菜鸟到高手(2):清空Python控制台
执行python命令会进入Python控制台.在Python控制台中可以用交互的方式执行Python语句.也就是执行一行Python语句,会立刻返回执行结果. 当Python控制台输入过多的Pyt ...
- 使用ajax方法实现form表单的提交
作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. 写在前面的话 在使用form表单的时候,一旦点击提交触发submit ...
- ASPCMS_判断语句if标签的使用
这几天在仿个企业站,又用到了ASPCMS.这个CMS系统支持响应式模板——视访问设备而使用不同的模板,这样PC.手机都能兼顾. ▼官方给出的说明: 1.满足条件则显示 {if:条件语句} 显示内容 { ...
- libmysqlclient.so.16: cannot open shared object file: No such file or directory
编译安装的mysql5.6.39,安装目录是/usr/local/mysql,启用程序时报错:libmysqlclient.so.16: cannot open shared object file: ...
- centos下部署redis服务环境及其配置说明
Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的开发工作由VMware主 ...
- 项目开发之package.json
Name 必须字段. 提示: 不要在name中包含js, node字样: 这个名字不能以点号或下划线开头: 这个名字不能包含有大写字母: 这个名字可能在require()方法中被调用,所以应该尽可能短 ...