hdu2825(狀壓dp AC自動機)

2021-08-21 19:42:17 字數 941 閱讀 9189

題目**

用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...