题目分析:

这道题的难点在于要取模,而题面没有写。

容易想到一个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] 碱基序列 【哈希】【动态规划】的更多相关文章

  1. UOJ#373. 【ZJOI2018】线图 搜索,树哈希,动态规划

    原文链接www.cnblogs.com/zhouzhendong/p/UOJ373.html 前言 真是一道毒瘤题.UOJ卡常毒瘤++.我卡了1.5h的常数才过QAQ Orzjry 标算居然是指数做法 ...

  2. 洛谷P4591 [TJOI2018]碱基序列(hash dp)

    题意 题目链接 Sol \(f[i][j]\)表示匹配到第\(i\)个串,当前在主串的第\(j\)个位置 转移的时候判断一下是否可行就行了.随便一个能搞字符串匹配的算法都能过 复杂度\(O(|S| K ...

  3. [TJOI2018]碱基序列

    嘟嘟嘟 现在看到字符串就想到SAM,所以很担心kmp啥的会不会忘了-- 这题感觉挺暴力的:首先当然要把\(s\)建成SAM,然后令\(dp[i][j]\)表示到第\(i\)组时,SAM上节点\(j\) ...

  4. BZOJ5337 [TJOI2018]str

    题意 小豆参加了生物实验室.在实验室里,他主要研究蛋臼质.他现在研究的蛋臼质是由k个氨基酸按一定顺序构成的.每一个氨基酸都可能有a种碱基序 列si_j 构成.现在小豆有一个碱基串s,小豆想知道在这个碱 ...

  5. 洛谷P4591 [TJOI2018]碱基序列 【KMP + dp】

    题目链接 洛谷P4591 题解 设\(f[i][j]\)表示前\(i\)个串匹配到位置\(j\)的方案数,匹配一下第\(i\)个串进行转移即可 本来写了\(hash\),发现没过,又写了一个\(KMP ...

  6. 【[TJOI2018]碱基序列】

    题目 为什么没人用\(SAM\)啊 我们先把原来的模式串建一遍\(SAM\),之后我们就可以求出\(SAM\)上每一个节点的\(|endpos|\)就可以知道每一个子串出现的次数了,也就是在模式串上的 ...

  7. 「学习笔记」字符串基础:Hash,KMP与Trie

    「学习笔记」字符串基础:Hash,KMP与Trie 点击查看目录 目录 「学习笔记」字符串基础:Hash,KMP与Trie Hash 算法 代码 KMP 算法 前置知识:\(\text{Border} ...

  8. 【BZOJ5337】[TJOI2018]str(动态规划,哈希)

    [BZOJ5337][TJOI2018]str(动态规划,哈希) 题面 BZOJ 洛谷 题解 就很呆... 显然按层\(dp\),如果能够匹配上就进行转移,直接哈希判断是否能够匹配就好了... #in ...

  9. 【BZOJ5336】[TJOI2018]party(动态规划)

    [BZOJ5336][TJOI2018]party(动态规划) 题面 BZOJ 洛谷 题解 这题好神仙啊... 考虑普通的\(LCS\)的\(dp\),\(f[i][j]=\max\{f[i-1][j ...

随机推荐

  1. kubernetes 里面pod时间修改

    yaml文件中设置时区同步,只需要映射主机的“/etc/localtime”文件. apiVersion: extensions/v1beta1kind: Deploymentmetadata: na ...

  2. eclipse的快捷键【转载】

    原文地址http://www.open-open.com/bbs/view/1320934157953/ Eclipse中10个最有用的快捷键组合  一个Eclipse骨灰级开发者总结了他认为最有用但 ...

  3. POJ3714 Raid 分治/K-D Tree

    VJ传送门 简要题意:给出两个大小均为\(N\)的点集\(A,B\),试在\(A\)中选择一个点,在\(B\)中选择一个点,使得它们在所有可能的选择方案中欧几里得距离最小,求出这个距离 下面给出的两种 ...

  4. 在centos 7上安装BIMServer

    下载bimserverwar-1.5.85.war https://github.com/opensourceBIM/BIMserver/releases mkdir -p /opt/bim cd / ...

  5. (转)Ubuntu无法找到add-apt-repository问题的解决方法

    原文 网上查了一下资料,原来是需要 python-software-properties 于是 apt-get install python-software-properties 除此之外还要安装 ...

  6. LinqPad的变量比较功能

    LinqPad是一个非常方便的C#工具(有免费版和收费版). 今天发现它的变量比较功能真是方便啊.且看3行代码产生如下结果: 说明:图中两个变量的成员属性值分别用红色和绿色背景标注:图很长,只截取了一 ...

  7. 在平衡树的海洋中畅游(四)——FHQ Treap

    Preface 关于那些比较基础的平衡树我想我之前已经介绍的已经挺多了. 但是像Treap,Splay这样的旋转平衡树码亮太大,而像替罪羊树这样的重量平衡树却没有什么实际意义. 然而类似于SBT,AV ...

  8. 提升----你所不知道的JavaScript系列(3)

    很多编程语言在执行的时候都是自上而下执行,但实际上这种想法在JavaScript中并不完全正确, 有一种特殊情况会导致这个假设是错误的.来看看下面的代码, a = 2; var a; console. ...

  9. 数组-在Shell脚本中的基本使用介绍

    Shell脚本在运维工作中是极其重要的,而数组在shell脚本里的运用无论是在循环或运算方面都是非常实用的一个环节.下面是对shell脚本中数组方面一些操作在此进行记录,希望能帮助到有兴趣的朋友~1. ...

  10. C_数据结构_递归A函数调用B函数

    # include <stdio.h> int g(int); int f(int); int f(int n) { ) printf("haha\n"); else ...