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