HDU 4758 AC自動機 狀壓dp

2021-08-07 21:22:04 字數 1369 閱讀 3072

乙個矩形從左上角走到右下角,向右移動用r表示,向下移動用d表示,要求滿足移動序列中含有給出的兩個規定子串,問一共有多少種方案?

還是經典的ac自動機+狀壓dp思路,類似hdu-2825:

都是乙個套路。

#include 

using namespace std;

typedef long long ll;

const int inf = 0x3f3f3f3f;

const ll mod = 1e9 + 7;

struct acauto

void init()

int idx(char c)

void insert(char *buf, int id)

end[now] |= (1

<< id);

}void build()

}while (!q.empty()) }}

}} ac;

int r, d;

int dp[105][105][205][4];

const char d = ;

void solve()

//cout << i << " "

<< j << " "

<< k << " "

<< s << " ("

<< dp[i][j][k][s] << ") ---> "

<< ni << " "

<< nj << " "

<< nk << " "

<< ns <<" ("

<< dp[ni][nj][nk][ns] << ") "

<< endl;

if (j < d)

//cout << i << " "

<< j << " "

<< k << " "

<< s << " ("

<< dp[i][j][k][s] << ") ---> "

<< ni << " "

<< nj << " "

<< nk << " "

<< ns << " ("

<< dp[ni][nj][nk][ns] << ") "

<< endl;}}

}}

ll ans = 0;

for (int i = 0; i < ac.sz; i++)

printf("%i64d\n", ans);

}char str[1005];

int main()

ac.build();

/*for (int i = 0; i < ac.sz; i++) */

solve();

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

HDU 3247 AC自動機 狀壓DP

乙個n個資源串,m個病毒串。要求生成乙個字串,包含所有資源串,但不能包含病毒串。問生成字串的最小長度。首先利用ac自動機求出資源串的狀態轉移關係,因為資源串最多只有十種,因此可以進行狀態壓縮。在利用ac自動機求失配關係的時候 這裡在求失配關係的時候需要將不存在的邊補上 順便求出來狀態包含關係。求出失...