題目是要求最少出現k種模式串...開始我看成k個了..囧..k種的話可以用2^k-1的整數可以描述出模式串出現的任意情況...也就是將每個模式串出現否看成二進位制的1,0...題目中模式串最多10個..所以模式串存在狀態最多1023種...
先用ac自動機構造trie圖...這個已經很模板很模板了..值得注意的是在構造時給每個點我稱為data的值..代表從0點出發到這個點的串的字尾子串能是哪些模式串..為了保證完備性..應該將其fail的情況繼承下來..這個過程舉例子..假設當前點包含1,3號串..而其fail包含1,2號串...那麼當前點就應該包含1,2,3號串..用二進位制的角度看...當前串point[h].data=101..其fail: point[point[h].fail].data=011...而當前串應該變成point[h].data=111...這實際上就是二進位制的或運算了..
dp時每個狀態可以用三個值確定...1.當前長度,2.當前點標號.3.當前點標號下包含哪些串,也就是個十進位制表示的二進位制數..trie圖中每個點是狀態點..有向邊是轉移方向..轉移時同樣也是通過二進位制的或運算判斷是當前狀態轉移到下個狀態包含哪些串..
由於每個長度p的狀態只於p-1長度的狀態有關...所以可以用滾動陣列來節約空間...
結果的話..找出所有包含模式串》k情況的..將這些dp值都加起來...o了~
program:
#include#include#includeusing namespace std;
struct node1
point[102];
int n,m,k,dp[2][102][1025];
char s[12];
queuemyqueue;
bool used[105];
int ok(int x)
return a;
}int main()
return 0;
}
hdu 2825 AC自動機 狀壓dp
假設乙個字串長為n,現在在j這個位置,此時已經包含了乙個模式串集合 由於m只有10,所有可以用狀壓來表示模式串 到下乙個位置時,一共有26種情況,現在你想知道的是多乙個字母後會多幾個模式串,由於是多匹配問題便想到了ac自動機,而此時只要紀錄走道j這個位置時trie上走到k這個位置。所以狀態便是dp ...
HDU 2825 AC自動機 狀壓DP
給m個字串,要求組成乙個長度為n的字串,至少包含k個給定字串。利用ac自動機,我們可以進行狀態轉移,以及模板匹配。要求目標串長度為n,且包含k個給定字串。所以可以在包含給定字串的ac自動機上進行狀態轉移。dp i 1 u last u s dp i 1 u last u s dp i j s mod...
hdu2825 (AC自動機 狀壓DP)
題解 ac自動機,然後在自動機上跑一遍dp,第一維表示長度,第二維表示到達自動機上的哪乙個結點,第三維用二進位制表示有含有哪幾個字元 然後轉移方程就是 dp i 1 ret k v ret dp i 1 ret k v ret dp i j k mod 有些dp i j k 等於0就不用運算了 in...