2016 多校 Multi-University Training Contest 5 Two
2016-08-04 00:13
351 查看
hdu 5791 Two
题意是说,给你两个串,然后问你有多少对相同子串
112的子串有:1,1,2,12,12,112
找几个例子试了一下,发现这玩意可以dp,我称第二个串为模式串,第一个串为母串好了,我们先从模式串里一次取一个数字,然后去母串里找匹配的位置,发现一个匹配位置之后找前面有个几个符合要求的子串。
二维的dp,dp[i][j] 代表母串到第i位,模式串到第j位,有几个相同子串。
匹配位置:dp[i][j] = 2 * dp[i - 1][j - 1] + 1
意思是一个匹配的位置就去看之前有几个相同子串,加入一个新的数之后,之前的子串尾部可以选择添一个字符所以乘2,然后单个新的字符也是一个符合要求的子串,所以+1
具体实现用了树状数组,也许比直接dp快一点点?更新每个匹配位置,最后只要求和就ok。其实dp开两个 1000 长度的1维数组就够了。
题意是说,给你两个串,然后问你有多少对相同子串
112的子串有:1,1,2,12,12,112
找几个例子试了一下,发现这玩意可以dp,我称第二个串为模式串,第一个串为母串好了,我们先从模式串里一次取一个数字,然后去母串里找匹配的位置,发现一个匹配位置之后找前面有个几个符合要求的子串。
二维的dp,dp[i][j] 代表母串到第i位,模式串到第j位,有几个相同子串。
匹配位置:dp[i][j] = 2 * dp[i - 1][j - 1] + 1
意思是一个匹配的位置就去看之前有几个相同子串,加入一个新的数之后,之前的子串尾部可以选择添一个字符所以乘2,然后单个新的字符也是一个符合要求的子串,所以+1
具体实现用了树状数组,也许比直接dp快一点点?更新每个匹配位置,最后只要求和就ok。其实dp开两个 1000 长度的1维数组就够了。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const long long MOD = 1000000007; int n, m; int a[1005]; int b[1005]; long long dp[1005][1005]; int lowbit(int x) { return x&(-x); } long long sum(int pos, long long *arr) { long long tmp = 0; while (pos > 0) { tmp += arr[pos]; tmp %= MOD; pos -= lowbit(pos); } return tmp; } void plus(int pos, int s, long long *arr) { while (pos <= n) { arr[pos] += s; arr[pos] %= MOD; pos += lowbit(pos); } } int main(void) { while (scanf("%d%d", &n, &m) != EOF) { memset(dp, 0, sizeof dp); for (int i = 1; i <= n; i++) scanf("%d", &a[i]); for (int i = 1; i <= m; i++) scanf("%d", &b[i]); for (int i = 1; i <= m; i++) { for (int j = 1; j <= n; j++) dp[i][j] = dp[i - 1][j]; for (int j = 1; j <= n; j++) { if (b[i] == a[j]) ::plus(j, sum(j - 1, dp[i - 1]) + 1, dp[i]); //cout << sum(j, dp[i]) << " "; } //cout << endl; } printf("%lld\n", sum(n, dp[m])); } return 0; }
相关文章推荐
- 2016 Multi-University Training Contest 5 1011 Two(DP)
- [HDU5799] This world need more Zhu [2016 Multi-University Training Contest 6(2016多校联合训练2) 1007]
- [HDU5739] Fantasia [2016 Multi-University Training Contest 2(多校联合训练2) F]
- 2016 多校 Multi-University Training Contest 4 Another Meaning
- [HDU5741] Helter Skelter [2016 Multi-University Training Contest 2(2016多校联合训练2) H]
- 2016 多校 Multi-University Training Contest 4 Substring
- HDU 5791 Two(DP)2016 Multi-University Training Contest 5
- 2016 Multi-University Training Contest 4(2016多校训练第四场)1011
- 【2016多校训练4】Multi-University Training Contest 4
- 2016 Multi-University Training Contest 8(2016多校训练第八场)1011
- [HDU5828] Rikka with Sequence [2016 Multi-University Training Contest 8(2016多校联合训练8) 1008]
- DP——Two ( HDU 5791 ) ( 2016 Multi-University Training Contest 5 1011 )
- 2016 多校 Multi-University Training Contest 6 A Simple Chess
- 2016 Multi-University Training Contest 2(2016多校训练第二场)1009
- [HDU5727] Necklace [2016 Multi-University Training Contest 1(2016多校联合训练1) E]
- [HDU5826] physics [2016 Multi-University Training Contest 8(2016多校联合训练8) 1006]
- [HDU5764] After a Sleepless Night [2016 Multi-University Training Contest 4(2016多校联合训练4) B]
- [HDU5788] Level Up [2016 Multi-University Training Contest 5 1008 (2016多校联合训练5)]
- [HDU5756] Boss Bo [2016 Multi-University Training Contest 3(2016多校联合训练3) E]
- 2016 多校 Multi-University Training Contest 5 Divide the Sequence