hdu2825 ac自動機 狀壓dp

2022-06-01 08:09:12 字數 1096 閱讀 2296

傳送門

給你一些密碼片段字串,讓你求長度為n,且至少包含k個不同密碼片段串的字串的數量。

因為密碼串不多,可以考慮狀態壓縮

設dp[i][j][sta]表示長為i的字串匹配到j節點且狀態為sta的數量。

其中sta儲存的是包含的密碼串情況,在構建fail指標時,當前節點要並上fail指標所指的節點。

跑ac自動機,兒子節點從父親節點轉移。

最後取dp[len][...][sta]的和,其中sta滿足二進位制中1的數量》=k,

這一點可以像樹狀陣列的lowbit那樣快速求出:

inline int count(int x)

return ret;

}

#include#include#include#include#include#include#includeusing namespace std;

const int n = 20, l = 20, mod = 20090717;

int n, m, k, tot;

long long dp[30][110][1100], ans;

char s[20];

queueque;

struct node

}trie[1010];

inline int getval(char st)

inline void insert(int num)

trie[pos].state |= 1 << num;

}inline void buildfail()

else trie[u].trans[i] = v;}}

}inline int count(int x)

return ret;

}inline void solve()

for(int i = 1; i <= tot; i++)

for(int sta = 0; sta < limit; sta++)

}int main()

buildfail();

solve();

cout << ans << endl;

}}

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...