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 ...
随机推荐
- [02] SpringBoot的项目属性配置
1.application.properties 简述 配置文件的使用和调整都非常方便,直接在项目默认的classpath下的application.properties文件中做调整即可.例如Spri ...
- 玩转 ”hello word“,Python程序员大多数都没有实现过
很多人学习Python很长时间,对于'hello word' 的认知,很多已经从事Python多年的程序员的认知也就只有: print(hello wrod) 但是有没有让hello word 变得不 ...
- TopShelf 自动配置Service测试
在开发中经常会遇到后台定时处理数据和任务的情况,处理这些事情大概有以下几种方案: 1.使用数据库的job功能.优点是在数据库中可以完成的就在数据库中完成,配置等基础设施数据库都提供,简单快捷.缺点是如 ...
- EZ 2018 06 17 NOIP2018 模拟赛(十九)
这次的题目难得的水,但是由于许多哲学的原因,第二题题意表述很迷. 然后是真的猜题意了搞了. 不过这样都可以涨Rating我也是服了. Upt:链接莫名又消失了 A. 「NOIP2017模拟赛11.03 ...
- Luogu P1306 斐波那契公约数
这道题其实是真的数学巨佬才撸的出来的题目了 但如果只知道结论但是不知道推导过程的我感觉证明无望 首先这道题肯定不能直接搞,而且题目明确说明了一些方法的问题 所以就暗示我们直接上矩阵了啦 但是如果直接搞 ...
- C# 获取文件MD5值的方法
可用于对比文件是否相同 /// <summary> /// 获取文件MD5值 /// </summary> /// <param name="fileName& ...
- JVM规范系列第6章:Java虚拟机指令集
一条 Java 虚拟机指令由一个特定操作的操作码和零至多个操作所使用到的操作数所构成. 虚拟机指令 = 操作码 + 操作数. 其中,操作码值分别为 254(0xfe)和 255(0xff),助记符分别 ...
- item 5: 比起显式的类型声明,更偏爱auto
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 啊,简单愉快的代码: int x; 等等,讨厌!我忘了初始化x,所 ...
- Python零基础入门(安装步骤,验证方式, 简单操作)
本篇文章适合新人小白初步了解Python,涵盖Python的介绍.安装以及简单的基础操作. 1.Python简介 Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言.它的设 ...
- 用EXCLE群发outlook邮件
Outlookでメール一括送信する方法(差し込み.HTML形式.添付ファイル複数あり) メールを一括送信する方法はウェブ上にいくつも紹介されていましたが.以下のすべての条件を満たすものが見つからなかっ ...