hdu 2243 AC自動機 矩陣加速

2021-06-21 13:09:50 字數 1519 閱讀 2233

給你 n 個病毒,問長度為 [1, m] 的,包括病毒的有多少。全都是小寫字母。

和 poj 2778 有點像。不一樣的是:

1)  這個是求包括的,我這麼做的,加一維用來表示已經包括了病毒的狀態。

2)  求長度是 [1, m] 的。在矩陣裡面維度變成二倍。

[a 1]

[1 0] 左下面的 1 就是最後所求。a是矩陣的話,就把 1 變成 i 矩陣, 把 0 變成 零矩陣。

這裡建立好的轉移矩陣左下面的是 i 矩陣, 所以ans矩陣初始化的時候不是 i 矩陣,而是轉移矩陣。

如果把 ans 矩陣初始化為大 i 矩陣,那麼矩陣乘 (m+1) 次就好了。

[cpp]view plain

copy

print?

const

intnn = 33;  

const

intkind = 26;  

intcnt;

//狀態數,矩陣大小

char

ch[9];  

intfail[nn];

//每個狀態的fail指標

intchild[nn][kind];

//01兩種

intend[nn];

//每個狀態是否已經包含一整個病毒

ll dp[nn][nn];//轉移矩陣

struct

tri;  

intnewnode()  

void

insert(

char

*str, 

introot)  

end[p] = 1;  

}  //這個建立fail指標不同於hdu2222

//這裡的fail不能有空指標,必須要指向乙個狀態

queue>q;  

void

build_fail(

introot) else

}  }  }  

void

init_dp()  

for(

intj = 0; j < kind; ++j)  

}  dp[cnt+1][cnt+1] = 26;  

++cnt;  

}  tri mul(tri x, tri y)  

}  }  

return

z;  

}  ll solve(int

m)  

}  cnt = cnt * 2 + 1;  

while

(m)  

ll res = ans.a[cnt/2+1][cnt/2];  

return

res;  

}  int

main()  

build_fail(root);  

init_dp();  

ll res = solve(m);  

cout<}  

return

0;  

}  

HDU 2243 AC自動機 矩陣快速冪

中文題,不解釋 這道題其實和poj 2778是一樣的,只是需要對矩陣有著更深刻的理解而已。我們很容易便能像poj 2778一樣求出來不包含條件字串的字串方案。只是題目中要求長度小於等於l,所以我們可以在矩陣中手動加乙個點,這個點允許從任何狀態轉移而來。這點的意義表示字串終止。也就是說如果字串轉移到這...

MZ hdu 2243 AC自動機 矩陣加速

給你 n 個病毒,問長度為 1,m 的,包括病毒的有多少。全都是小寫字母。和 poj 2778 有點像。不一樣的是 1 這個是求包括的,我這麼做的,加一維用來表示已經包括了病毒的狀態。2 求長度是 1,m 的。在矩陣裡面維度變成二倍。a 1 1 0 左下面的 1 就是最後所求。a是矩陣的話,就把 1...

HDOJ 2243 AC自動機 等比矩陣求和

題目是要說小於l長度的由小寫字母組成的字串有多少個包含所給的串.從正方向想.要求出包含的.並且還要踢去重複包含的.又要加上被多踢的.整個一容斥問題了.但這題明顯是不可行的.那麼換個角度.先求出總共小於l的單詞數 26 1 26 2 26 3 26 l 然後再減去不包括所給字串的單詞.相當於把每個單詞...