poj2778
求長度為m且不包含n個子串的種類數.
參考自這個部落格.ac自動機+矩陣快速冪.
這兒有個結論.
給定乙個有向圖,問從a點恰好走k步(允許重複經過邊)到達b點的方案數mod p的值
把給定的圖轉為鄰接矩陣,即a(i,j)=1當且僅當存在一條邊i->j。令c=
a*a
,那麼c(i,j)=σa(i,k)*a(k,j),實際上就等於從點i到點j恰好經過2條邊的路徑數(列舉k為中轉點)。類似地,ca(這裡的c已經是aa)的第i行第j列就表示從i到j經過3條邊的路徑數。
#include
#include
#include
#include
using
namespace std;
typedef
long
long ll;
int tot;
const
int mod=
100000
;int _size;
struct matix
matix operator*(
const matix &m2)
; matix operator
^(ll k)
return ans;
}}g,res;
struct trie
intnewnode()
void
init()
void
insert
(char buf)
end[now]=1
;}void
build()
}while
(!q.
empty()
)}} tot=l;
for(
int i=
0;i}} ac;
char buf[
1000010];
intmain()
ac.build()
; _size=tot;
for(
int i=
0;i) res.m[i]
[i]=1;
while
(m)long
long ans=0;
for(
int i=
0;i)printf
("%lld\n"
,ans)
;//system("pause");
return0;
}
poj2778 ac自動機 矩陣快速冪
給m個子串,求長度為n的不包含子串的母串數,最直接的應該是暴搜,肯定tle,考慮用ac自動機 將子串建成字典樹,通過next表來構造矩陣,然後用矩陣快速冪求長度為n的數量 鄰接矩陣 對於a i,j k 是指從i到j經過k個點的所有情況數 注意對於end陣列,如果某個節點如果fail指標end陣列為1...
poj2778(AC自動機 矩陣快速冪)
題意 給你n個字串,問你長度為m的字串且字串中不含有那n個子串的字串的數量 解題思路 這道題一開始就不太懂,還以為是組合數學的題目,後面看了別人的部落格,才知道這是屬於ac自動機的另一種用法,是關於fail陣列的運用,因為題目問的是不允許包含那n個字串,所以我們可以這麼想,假設乙個trie樹每個結點...
poj 2778 AC自動機 DP 矩陣快速冪
include include include includeusing namespace std typedef int64 type const int kind 4 每個節點的子節點的個數上限 const int mod 100000 const int size 109 轉移矩陣的行大小 ...