題目**
用ac自動機來儲存狀態 ,用dp來轉移
dp[i][j][k] 表示當長度為i時,串末尾為 自動機中 j 節點多對應的值,此時串中選擇狀態為k 的數目
轉移時,下一位狀態,字元長度加一,i+1,即是可以由,j +乙個新的字元,獲得如果這個字元正好是串的最後乙個字元,那麼k的狀態變化為 加上該字元的狀態;
ac**如下:
# include# include# include# include# include#include#include#include#include#includeusing namespace std;
const int n=110;
const int mod = 20090717;
int cnt;
int ch[n][30];
int f[n],val[n];
int n,m,k;
int num[1<<11];
int dp[30][n][1<<10];
int ans;
void init()
int idx(char x)
void insertt(string p,int id)
}while(!q.empty())
q.push(u);
int v = f[r];
while(v && !ch[v][i]) v = f[v];
f[u] = ch[f[r]][i];
//val[u] |= val[f[u]];
// last[u] = val[f[u]]? f[u] :last[f[u]];}}
}void getnum()
getfail();
int ans = solve();
cout<}
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)
題解 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就不用運算了 in...