【矩阵快速幂】HDU 5318 The Goddess Of The Moon

通道

题意:n个数,A后缀和B的前缀相同,建边,问长度为m的有多少个。

思路:建图,完了

代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include <vector>
 4
 5 using namespace std;
 6
 7 typedef long long ll;
 8
 9 const int MAX_N = 57;
10 const ll MOD = 1000000007;
11
12 typedef vector<ll> vec;
13 typedef vector<vec> mat;
14 mat Mul(mat A, mat B) {
15     mat C(A.size(), vec(B[0].size()));
16     int la = A.size(), lb = B.size(), lc = B[0].size();
17     for (int i = 0; i < la; ++i)
18         for (int k = 0; k < lb; ++k)
19             for (int j = 0; j < lc; ++j)
20                 C[i][j] = (C[i][j] + A[i][k] * B[k][j] % MOD) % MOD;
21     return C;
22 }
23 mat Pow(mat A, ll n) {
24     mat B(A.size(), vec(A.size()));
25     int len = A.size();
26     for (int i = 0; i < len; ++i) B[i][i] = 1;
27     while (n > 0) {
28         if (n & 1) B = Mul(B, A);
29         A = Mul(A, A);
30         n >>= 1;
31     }
32     return B;
33 }
34
35 int N, M;
36 char str[MAX_N][20];
37
38 bool check(int i, int j) {
39     if (i == j) return true;
40     int l1 = strlen(str[i]), l2 = strlen(str[j]);
41     for (int k = 2; k <= min(l1, l2); ++k) {
42         int p1 = l1 - k, p2 = 0, found = 1;
43         while (p2 < k) if (str[i][p1++] != str[j][p2++]) found = false;
44         if (found) return true;
45     }
46     return false;
47 }
48
49 #include <set>
50 #include <string>
51
52 set<string> mp;
53
54 int main() {
55     int T;
56     scanf("%d", &T);
57     while (T-- > 0) {
58         scanf("%d%d", &N, &M);
59         mat A(N, vec(N));
60         mp.clear();
61         for (int i = 0; i < N; ++i) {
62             scanf("%s", str[i]);
63             if (strlen(str[i]) < 2) {
64                 --i, --N;
65                 continue;
66             }
67             if (mp.count(str[i])) --i, --N;
68             else mp.insert(str[i]);
69         }
70         if (M <= 1) {
71             printf("%d\n", N);
72             continue;
73         }
74         for (int j = 0; j < N; ++j) {
75             for (int k = 0; k < N; ++k) {
76                 if (check(j, k)) A[j][k] = 1;
77                 else A[j][k] = 0;
78             }
79         }
80
81         A = Pow(A, M - 1);
82         ll ans = 0;
83         for (int i = 0; i < N; ++i) for (int j = 0; j < N; ++j)
84             ans = (ans + A[i][j]) % MOD;
85         printf("%lld\n", ans);
86     }
87
88     return 0;
89 }
90
91 /*
92 2
93 10 1
94 12 1213 1212 1313231 12312413 12312 4123 1231 3 131
95 */

时间: 2024-12-19 08:06:10

【矩阵快速幂】HDU 5318 The Goddess Of The Moon的相关文章

矩阵快速幂 HDOJ 5318 The Goddess Of The Moon

题目传送门 1 /* 2 DP::dp[i][k] 表示选择i个字符串,最后一次是k类型的字符串,它由sum (dp[i-1][j]) (a[j], a[k] is ok)累加而来 3 矩阵快速幂:将n个字符串看成n*n的矩阵,如果匹配,矩阵对应位置为1.矩阵缩短递推dp时间,然后乘m-1次(dp[m][i])累加即可 4 注意去重 5 详细解释:http://blog.csdn.net/keshuai19940722/article/details/47111215 6 */ 7 #inclu

HDU 5318 The Goddess Of The Moon (矩阵快速幂)

题目链接:HDU 5318 The Goddess Of The Moon 题意:给出N串字符串,若是一个字符串的后缀与另一个字符串的前缀相同并且长度大于1,就表示这两个字符串是可以相连的,问M个字符串相连不同方案数为多少. 思路: 1.将输入的字符串预处理存入一个矩阵中,mp[i][j]=1说明str[i]与str[j]能相连,反之,则不能相连. 2.str[i]与str[j]能相连 转化为 i点到j点可达,那么就可以得到一个有向图,长度为M的意思就是 两点之间所走的步数为M的不同走法有多少种

hdu 5318 The Goddess Of The Moon(矩阵快速幂)

题目链接:hdu 5318 The Goddess Of The Moon 将50个串处理成50*50的矩阵,注意重复串. #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> using namespace std; const int maxn = 55; const int mod = 1e9+7; int N, M, A[maxn]; struct M

HDU 5318 The Goddess Of The Moon(矩阵快速幂详解)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5318 题面: The Goddess Of The Moon Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 800    Accepted Submission(s): 349 Problem Description Chang'e (嫦

hdu 5318 The Goddess Of The Moon 矩阵高速幂

链接:http://acm.hdu.edu.cn/showproblem.php?pid=5318 The Goddess Of The Moon Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 438    Accepted Submission(s): 150 Problem Description Chang'e (嫦娥) is

矩阵快速幂——HDU 2604

对应HDU题目:点击打开链接 Queuing Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3114    Accepted Submission(s): 1419 Problem Description Queues and Priority Queues are data structures which are known t

递推+矩阵快速幂 HDU 2065

1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 5 using namespace std; 6 7 //矩阵大小上限 8 const int SIZ=100; 9 int MOD=100; 10 11 //矩阵大小为n*m,初始化全部为0 12 struct mat 13 { 14 int n,m; 15 int ar[SIZ][SIZ]; 16 mat() 17 { 18 memset

[矩阵快速幂] hdu 5015 233 Matrix

之前各种犯傻 推了好久这个东西.. 后来灵关一闪  就搞定了.. 矩阵的题目,就是构造矩阵比较难想! 题意:给出一个矩阵的第一列和第一行(下标从0开始),(0,0)位置为0, 第一行为,233,2333,23333...一次加个3, 第一列为输入的n个数. 然后从(1,1)位置开始,等于上面的数加左边的数,问(n+1,m+1)的数是多少,也就是右下角的数 思路: 把矩阵画出来: |   0     233   2333  | |  b0     b1     b2     | |  c0    

矩阵快速幂 HDU 4565 So Easy!(简单?才怪!)

题目链接 题意: 思路: 直接拿别人的图,自己写太麻烦了~ 然后就可以用矩阵快速幂套模板求递推式啦~ 另外: 这题想不到或者不会矩阵快速幂,根本没法做,还是2013年长沙邀请赛水题,也是2008年Google Codejam Round 1A的C题. #include <bits/stdc++.h> typedef long long ll; const int N = 5; int a, b, n, mod; /* *矩阵快速幂处理线性递推关系f(n)=a1f(n-1)+a2f(n-2)+.

矩阵快速幂 [HDU 4549] M斐波那契数列

M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 1609    Accepted Submission(s): 460 Problem Description M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = aF[1] = bF[n] = F[n-1] * F[n-2] ( n > 1 ) 现在给出a,