BZOJ 4861 魔法咒語

2021-09-14 08:10:27 字數 3303 閱讀 6743

bzo

j1009dp

bzoj 1009 dp

bzoj10

09dp

方面的弱化版,加大了矩陣構造難度和預處理難度

題面:solution:

對於l

≤100

l\leq 100

l≤10

0的正常在dfa

dfadf

a上跑dpdp

dp即可,需要預處理點p

pp接上串i

ii以後在tri

etrie

trie

圖上匹配到了哪個點,以及中間有沒有禁點(能否轉移)

定義m at

chno

de[p

][k]

matchnode[p][k]

matchn

ode[

p][k

]為點p

pp匹配完串k

kk以後的位置,

n xt

er[p

][k]

nxter[p][k]

nxter[

p][k

]為是否能轉移。

顯然可以得到:

n xt

a=f[

i+le

n[k]

][ma

tchn

ode[

p][k

]]+f

[i][

p]

;nxta = f[i + len[k]][matchnode[p][k]] + f[i][p];

nxta=f

[i+l

en[k

]][m

atch

node

[p][

k]]+

f[i]

[p];

f [i

+len

[k]]

[mat

chno

de[p

][k]

]=nx

ta

;f[i + len[k]][matchnode[p][k]] = nxta;

f[i+le

n[k]

][ma

tchn

ode[

p][k

]]=n

xta;

考慮後面l≤1

09

l\leq 10^9

l≤10

9的資料,轉移範圍≤

2\leq2

≤2顯然是矩陣快速冪。

對於初始矩陣ssss

ss,第一行上放f[1

]f[1]

f[1]

以及f [2

]f[2]

f[2]

,對於轉移矩陣g

gg,分成四個部分,左上為0

00,右上為距離為2

22的轉移,

左下為單位矩陣,右下為距離為1

11的轉移

注意如果dfa

dfadf

a及建立從0

00開始,那麼對應節點數應該+1+1

+1,並且匹配到的點在矩陣上也+1+1

+1就是dfa

dfadf

a向矩陣對映+1+1

+1,反過來對映−1-1

−1。

#include

#include

#include

const

int n =

3e3+7;

typedef

long

long ll;

inline

intmax

(int a,

int b)

inline

intmin

(int a,

int b)

const

int mod =

1e9+7;

int pcnt =0;

int n, m, l;

struct trie t[n]

;int totstr =

0, len[n]

;char str[60]

[60];

inline

void

ins(

char

*ss)

t[p]

.end |=1

;}#include

int nxter[n][60

], matchnode[n][60

];inline

void

getfail()

for(

int i =

0; i <= pcnt; i++

)for

(int j =

1; j <= totstr; j++)}

if(!flag) matchnode[i]

[j]= p;}}

}ll f[

107]

[n];

//f[i][j]表示填到第i位,在j節點

inline

voiddp(

)}}}

char sin[n]

;int upmax =

203;

struct mat

inline

void

mem1()

};inline mat mul

(mat a, mat b)

return c;

}inline mat fst

(mat a,

int k)

return c;

}mat g, unit;

void

matin()

} f[0]

[0]=

1;for(

int i =

0; i <=

3; i++

)for

(int p =

0; p <= pcnt; p++)}

} unit.

clean()

;for

(int i =

1; i <= upmax; i++

) unit.a[1]

[i]= f[1]

[i -1]

, unit.a[1]

[i + upmax]

= f[2]

[i -1]

;}void

init()

intmain()

else

return0;

}

BJOI2017 魔法咒語

矩陣乘法 ac 自動機 是道很不錯的題了 首先是前六十分,就是乙個 ac 自動機上的套路 dp 設 dp i j 表示匹配出的長度為 i 在自動機上位置為 j 的方案數,轉移的話就列舉下乙個單詞選擇哪個放到自動機上一波匹配就好了 後面 40 分強行變成了另外一道題,l 變成了 1e8 一看就是矩乘的...

BJOI2017 魔法咒語

題目鏈結 給 n 個基本詞彙,m 個禁忌詞語。求用基本詞彙 每個詞彙可重複詞彙 拼成長度為 l 的 不包含任何禁忌詞語的字串的方案數。在 資料規模與約定 中,我們發現可以把資料劃分成兩檔 l le 100 的 前 60pts 基本長度不超過 2 的 顯然不包含這個東西判定可以用 ac 自動機,用 m...

bzoj4964 加長的咒語

求區間最長匹配的括號序列子串。很有意思的括號,但是我有些細節沒處理好,導致 長,演算法複雜。如果有更好的演算法我也很想知道啊 考慮乙個括號序列a b1 b2 b3 其中與某個括號匹配的相對的括號唯一。證明顯然。有乙個顯然的演算法 用棧判斷乙個字串是否為括號序列。考慮拓展這個結論 對任意括號串的某個括...