乙個矩形從左上角走到右下角,向右移動用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自動機求失配關係的時候 這裡在求失配關係的時候需要將不存在的邊補上 順便求出來狀態包含關係。求出失...