HDU 5318 The Goddess Of The Moon(遞推+矩陣優化)
題目連結:傳送門
題意:
相當於有一個長度為m的路,我們有n種磚,每種磚被表示為一個字串,一個長度大於等於2的字尾等於
另一個字串的字首那麼那一塊磚就可以放在這塊磚的後面。
分析:
這個就是常見的鋪磚的那個模型變化而來的,但是這題的遞推關係需要根據題目給定的字串的結構來決
定,由於m比較大,我們需要用矩陣來優化,根據題目給定的字串來確定狀態轉移矩陣A,初始的矩陣為單
位矩陣I,然後ans = A^(m-1)*I.在確定A的時候注意給字串去重。
程式碼如下:
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <set>
using namespace std;
const int maxn = 55;
typedef long long LL;
const LL mod = 1e9+7;
int n,m,cnt;
string str[maxn];
set<string > st;
struct matrix{
LL a[maxn][maxn];
matrix(){
memset(a,0,sizeof(a));
}
};
matrix I,A;
void init(){
for(int i=0;i<maxn;i++)
for(int j=0;j<maxn;j++)
I.a[i][j]=(i==j);
}
int judge(string a,string b){
for(int j=2;j<=a.length()&&j<=b.length();j++){
bool tag = 0;
for(int i=0;i<j;i++){
if(a[a.length()-j+i]!=b[i]){
tag=1;
break;
}
}
if(!tag) return 1;
}
return 0;
}
void getA(){
for(int i=0;i<cnt;i++){
for(int j=0;j<cnt;j++){
A.a[i][j]=judge(str[i],str[j]);
}
}
}
matrix multi(matrix A,matrix B){
matrix C;
for(int i=0;i<cnt;i++){
for(int j=0;j<cnt;j++){
for(int k=0;k<cnt;k++){
C.a[i][j]=(C.a[i][j]+A.a[i][k]*B.a[k][j]%mod)%mod;
}
}
}
return C;
}
LL quick(matrix A,int b){
matrix ans=I;
while(b){
if(b&1) ans=multi(ans,A);
b>>=1;
A=multi(A,A);
}
LL sum=0;
for(int i=0;i<cnt;i++){
for(int j=0;j<cnt;j++){
sum=(sum+ans.a[i][j])%mod;
}
}
return sum;
}
int main()
{
init();
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
if(n==0||m==0){
puts("0");
continue;
}
string s;
st.clear();
cnt=0;
for(int i=0;i<n;i++){
cin>>s;
if(st.find(s)==st.end()){
str[cnt++]=s;
st.insert(s);
}
}
getA();
init();
printf("%I64d\n",quick(A,m-1));
}
return 0;
}
/****
5
5 50
121 123 213 132 321
1 0 0 1 0
0 1 0 0 0
0 0 1 0 1
0 0 1 1 0
0 0 0 1 1
797922656
**/
相關文章
- HDU 4686 Arc of Dream(矩陣加速遞推)矩陣
- HDU 4686 (推公式+矩陣快速冪)公式矩陣
- 【矩陣乘法】【快速冪】遞推矩陣
- 矩陣加速線性遞推矩陣
- 動態dp & 矩陣加速遞推矩陣
- HDU 3117 Fibonacci Numbers(Fibonacci矩陣加速遞推+公式)矩陣公式
- HDU 4565 So Easy!(公式化簡+矩陣)公式矩陣
- hdu 1757 矩陣連乘矩陣
- HDU4565 So Easy! (矩陣)矩陣
- 第?課——基於矩陣快速冪的遞推解法矩陣
- 矩陣經典題目七:Warcraft III 守望者的煩惱(矩陣加速遞推)矩陣Raft
- HDU 1005 Number Sequence(矩陣)矩陣
- HDU 1575 Tr A(矩陣快速冪)矩陣
- HDU 4565 So Easy!(矩陣快速冪)矩陣
- HDU 2254 奧運(數論+矩陣)矩陣
- HDU 4920 Matrix multiplication(矩陣相乘)矩陣
- CUDA 矩陣乘法終極優化指南矩陣優化
- openjudge1768 最大子矩陣[二維字首和or遞推|DP]矩陣
- HDU 4965 Fast Matrix Calculation(矩陣快速冪)AST矩陣
- hdu1025 最大遞增子序列的優化優化
- HDU 3059 Fibonacci數列與矩陣求和 矩陣大小不固定矩陣
- 旋轉矩陣推導矩陣
- HDU 2157 How many ways?? (矩陣快速冪)矩陣
- HDU 1005 Number Sequence(矩陣快速冪)矩陣
- HDU 2256Problem of Precision(矩陣快速冪)矩陣
- HDU 1575 Tr A【矩陣快速冪取模】矩陣
- HDU 1005 Number Sequence:矩陣快速冪矩陣
- HDU5411CRB and Puzzle(矩陣快速冪)矩陣
- HDU1588Gauss Fibonacci(矩陣)矩陣
- 協方差矩陣推導1矩陣
- THREE 矩陣優先原則和平移旋轉矩陣矩陣
- HDU 2276 - Kiki & Little Kiki 2 (矩陣快速冪)矩陣
- HDU 4291 A Short problem(矩陣快速冪+迴圈節)矩陣
- 矩陣相乘優化演算法實現講解矩陣優化演算法
- 三維旋轉矩陣推導矩陣
- 二維旋轉矩陣推導矩陣
- hdu2243 ac自動機+矩陣連乘矩陣
- hdu 3117矩陣+斐波那契數列矩陣