hdu4057 ac自動機 dp(我用的方法)

2021-07-09 18:12:11 字數 1263 閱讀 7584

艾瑪雖說在10s的時限內用7s過了但是為啥前面那麼多人都在1s內就搞定了囧。。。

因為太氣了所以發個題解上來(霧。。順便紀念一下ac自動機系列的完成!

那麼說正題,這道題顯然就是先建ac自動機了,題目要求每個串只能被計算一次,這種情況用一般的做法就難辦了。

然後因為n最大只有10,容易聯想到狀壓,於是結尾標記我用1《再之後就是dp了,定義狀態dp[長度][在ac自動機上的狀態節點][各模式串被計算的狀態],這樣是100*1000*1024空間是不夠的,所以我們要把長度那一維滾動掉

狀態轉移也很容易想到啦,詳細的我就不說了反正下面有**

跑這麼慢真的好氣啊,有沒有啥地方可以優化一下啊囧。。。或者有更好的dp姿勢嗎???

**:#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

typedef unsigned long long ull;

#define rep(i,k,n) for(int i=(k);i<=(n);i++)

#define rep0(i,n) for(int i=0;i<(n);i++)

#define red(i,k,n) for(int i=(k);i>=(n);i--)

#define sqr(x) ((x)*(x))

#define clr(x,y) memset((x),(y),sizeof(x))

#define pb push_back

#define mod 1000000007

const int maxnode=1110;

const int maxs=4;

int mp[100];

int w[20];

struct ac_automation

void init()

void insert(char str,int id)

end[now]|=1rep0(i,maxs)

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

}int dp[2][maxnode][1<<11];

const int inf=0x80808080;

inline void upd(int &a,int b)

void solve(int n,int m)

{clr(dp,128);

int now=0,last,tot=1<

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自動機求失配關係的時候 這裡在求失配關係的時候需要將不存在的邊補上 順便求出來狀態包含關係。求出失...