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 其中與某個括號匹配的相對的括號唯一。證明顯然。有乙個顯然的演算法 用棧判斷乙個字串是否為括號序列。考慮拓展這個結論 對任意括號串的某個括...