poj2778 ac自動機 矩陣快速冪

2021-09-27 08:12:15 字數 1346 閱讀 7457

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 轉移矩陣的行大小 ...