原创 【洛谷 SP8093】 JZPGYZ - Sevenk Love Oimaster(後綴自動機)

題目鏈接 廣義sam。。 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAXN = 1000010; st

原创 【洛谷 P3674】 小清新人渣的本願(bitset,莫隊)

題目鏈接 因爲每個數都是\(10^5\)以內,考慮直接用\(bitset\)維護。 \(a-b=x\),其實就是看是否有\(p\)和\(p+x\)同時存在,直接\(bitset\)移位按位與一下就好了。 \(a+b=x\),這個直接搞不好搞

原创 【洛谷 P4688】 [Ynoi2016]掉進兔子洞(bitset,莫隊)

題目鏈接 第一道Ynoi 顯然每次詢問的答案爲三個區間的長度和減去公共數字個數*3. 如果是公共數字種數的話就能用莫隊+bitset存每個區間的狀態,然後3個區間按位與就行了。 但現在是個數,bitset中除了保存每個數是否出現外,還要保存

原创 【洛谷 P2226】 [HNOI2001]遙控賽車比賽(最短路)

題目鏈接 首先拆點,把每個點拆成4個點,表示到達這個點的時候賽車的朝向。 然後考慮連邊。 相鄰同向並且都是可以走的點直接連邊權1的邊。 至於怎麼轉向,只需在每個點\(i\)向每個方向一直拓展直到不能走爲止,如果當前點的深度大於靈敏度,從\(

原创 【洛谷 P4070】 [SDOI2016]生成魔咒(後綴自動機)

題目鏈接 建出\(SAM\)後,不同子串個數就是\(\sum len(i)-len(fa(i))\) 因爲\(SAM\)在線的,所以每加入一個字符就能直接加上其貢獻,於是這道題就沒了。 因爲\(x\)有點大,所以把\(ch\)改成\(map

原创 【SP1811】 LCS - Longest Common Substring(後綴自動機)

題目鏈接 對第一個串建出\(SAM\),然後用第二個串去匹配。 如果能往下走就往下走,不能的話就跳parent tree的父親,直到能走爲止。如果跳到\(0\)了還是不能走,重新匹配。 #include <cstdio> #include

原创 【洛谷 P2408】 不同子串個數(後綴自動機)

題目鏈接 裸體就是身體。 建出\(SAM\),\(DAG\)上跑\(DP\),\(f[u]=1+\sum_{(u,v)\in DAG}f[v]\) 答案爲\(f[1]-1\)(因爲根節點沒有字符) #include <cstdio> #in

原创 【洛谷 P3975】 [TJOI2015]弦論(後綴自動機)

題目鏈接 建出後綴自動機。 T=0,每個子串算一次,否則每個子串算該子串的\(endpos\)集合大小次。 用\(f[i]\)表示結點\(i\)表示的\(endpos\)集合大小,則\(f[i]\)爲其parent tree的子樹的\(f\

原创 【洛谷 P4248】 [AHOI2013]差異(後綴自動機)

題目鏈接 \[ans=\sum_{1<=i<j<=n}len(T_i)+len(T_j)-2*lcp(T_i,T_j)\] 觀察這個式子可以發現,前面兩個\(len\)是常數,後面的其實就是反串有每對前綴的相同後綴乘以其長度之和。 兩個前綴

原创 【洛谷 P3804】 【模板】後綴自動機

題目鏈接 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAXN = 1000010; struct SAM

原创 【洛谷 P3041】 [USACO12JAN]視頻遊戲的連擊Video Game Combos(AC自動機,dp)

題目鏈接 手寫一下AC自動機(我可沒說我之前不是手寫的) Trie上dp,每個點的貢獻加上所有是他後綴的串的貢獻,也就是這個點到根的fail鏈的和。 #include <cstdio> #include <queue> #include <

原创 【洛谷 P2051】 [AHOI2009]中國象棋(DP)

題目鏈接 首先想到狀壓dp,但是\(n,m\)高達100,怎麼壓? 容易發現,每行每列最多兩個象棋,否則就直接gg了。 一個巧妙的設置狀態的方式是,只需要記錄到當前行有多少列是放了1個炮和2個炮。 然後每一行有3種選擇:不放、放1個、放2個

原创 【洛谷 P4254】 [JSOI2008]Blue Mary開公司(李超線段樹)

題目鏈接 其實這東西很好懂的。。用來維護一次函數。 每個結點存一個值,表示x=這個區間的mid時值最大的函數的編號。 把插入線段的斜率和當前結點的斜率和大小比較來更新左右兒子的值。 查詢是實際上是查詢從根到這個葉節點鏈上的最大值。。 #in

原创 【洛谷 P3193】 [HNOI2008]GT考試(KMP,dp,矩陣乘法)

題目鏈接 \(f[i][j]\)表示准考證號到第\(i\)位,不吉利數字匹配到第\(j\)位的方案數。 答案顯然是\(\sum_{i=0}^{m-1}f[n][i]\) \(f[i][j]=\sum_{k=1}^{m-1}f[i-1][k]

原创 【洛谷 P3966】 [TJOI2013]單詞(AC自動機,差分)

把單詞連起來,中間插入間隔符,同 #include <cstdio> #include <queue> #include <cstring> using namespace std; struct Node{ int fail, n