題解: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就不用運算了
#include#include#include#include#include#includeusing namespace std;
const int mod = 20090717;
int n,m,k;
struct tried
int idx(char c)
int num(int x)
return ans;
}void insert(char *s,int id)
u = ch[u][d];
}v[u] = 1for(int d = 0; d < 26; d++)
if(ch[u][d])
q.push(ch[u][d]);
while(!q.empty())
int ret = ch[u][d];
f[ret] = ch[f[u]][d];
q.push(ret);}}
}void work()
}word;
char s[105];
int main()
word.getfail();
word.work();
}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...
hdu2825 ac自動機 狀壓dp
傳送門 給你一些密碼片段字串,讓你求長度為n,且至少包含k個不同密碼片段串的字串的數量。因為密碼串不多,可以考慮狀態壓縮 設dp i j sta 表示長為i的字串匹配到j節點且狀態為sta的數量。其中sta儲存的是包含的密碼串情況,在構建fail指標時,當前節點要並上fail指標所指的節點。跑ac自...