洛谷P4591 [TJOI2018]碱基序列 【KMP + dp】
2018-05-17 15:18
459 查看
题目链接
题解
设\(f[i][j]\)表示前\(i\)个串匹配到位置\(j\)的方案数,匹配一下第\(i\)个串进行转移即可
本来写了\(hash\),发现没过,又写了一个\(KMP\),依旧\(WA\),无奈去翻题解,竟然要取模??!!
题面怎么不讲啊,,
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<map> #define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt) #define REP(i,n) for (int i = 1; i <= (n); i++) #define mp(a,b) make_pair<int,int>(a,b) #define cls(s) memset(s,0,sizeof(s)) #define cp pair<int,int> #define LL long long int using namespace std; const int maxn = 10005,maxm = 100005,INF = 1000000000,Mod = 1000000007; inline int read(){ int out = 0,flag = 1; char c = getchar(); while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();} while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();} return out * flag; } char s[maxn],P[maxn]; int len,K,m,nxt[maxn]; LL f[105][maxn]; void getf(){ nxt[1] = 0; for (int i = 1,j = 0; i < m; i++){ while (j && P[i + 1] != P[j + 1]) j = nxt[j]; if (P[i + 1] == P[j + 1]) nxt[i + 1] = ++j; } } int main(){ K = read(); scanf("%s",s + 1); len = strlen(s + 1); for (int i = 0; i <= len; i++) f[0][i] = 1; for (int i = 1; i <= K; i++){ int a = read(); while (a--){ scanf("%s",P + 1); m = strlen(P + 1); getf(); int j = 0; for (int k = 1; k <= len; k++){ while (j && P[j + 1] != s[k]) j = nxt[j]; if (P[j + 1] == s[k]) j++; if (j == m){ f[i][k] = (f[i][k] + f[i - 1][k - m]) % Mod; } } } } LL ans = 0; for (int i = 0; i <= len; i++) ans = (ans + f[K][i]) % Mod; printf("%lld\n",ans); return 0; }
相关文章推荐
- BZOJ5337 [TJOI2018] 碱基序列 【哈希】【动态规划】
- jzoj5220 【GDOI2018模拟7.10】C (双序列dp)
- 【JZOJ5272】【GDOI2018模拟】神奇的重复序列(DP,性质题)
- poj 2018 斜率DP 求子序列的最大平均值
- bzoj3173 [Tjoi2013]最长上升子序列 dp Treap
- bzoj5157 [Tjoi2014]上升子序列(dp,树状数组优化)
- BZOJ 5157: [Tjoi2014]上升子序列 dp 线段树
- 【bzoj3173】【Tjoi2013】【最长上升子序列】treap+dp二分优化
- nyoj 214 单调递增子序列(二) dp+二分
- [CQOI 2018]交错序列
- hdu4745——Two Rabbits(区间dp,最长回文子序列)
- FZU 2129 子序列个数 (递推dp)
- BZOJ5301 [Cqoi2018]异或序列 【莫队】
- BZOJ5338 [TJOI2018] Xor 【可持久化Trie树】【dfs序】
- 子序列个数(51nod-1202)(dp)
- 51nod 1134 最长递增子序列(dp)
- 区间DP(括号序列,uva1626)
- Codeforces Round #323 (Div. 1) B. Once Again... (最长不下降序列_DP)
- HDU 1159 Common Subsequence 公共子序列 DP 水题重温
- BZOJ5333 [Sdoi2018]荣誉称号 【差分 + 树形dp】