題意:給出乙個字符集v和p個模式串(長度小於10),問由這個字符集中字元組成的長度為n的且不包含任意乙個模式串的字串有多少個?(字符集大小,n<=50, p <= 10) 。
思路:先將p個模式串建立ac自動機,標記好危險節點(flag陣列)。然後動歸來求:dp[i][j]表示長度為i且最後在節點j的字串個數(節點j必為安全節點),初始dp[0][1] = 1, 其他dp[i][j] = 0。由dp[i][j] 可以匯出,每個由j可以到達的安全節點son[j],執行:dp[i+1][son[j]] += dp[i][j]。因為從根走i步到達節點j有n種走法,那麼走i+1步到達son[j]的走法就要加n。最終的答案為∑。
最後的數量很大,需要用陣列存數。
需要注意:如果是用指標來儲存,那麼son[j]不僅指從j通過一條字母邊直接到達的son[j], 也可以是通過若干字首指標後再通過乙個字母邊到達son[j],(即son[j]並不一定是 j 的子節點)。而用陣列儲存恰恰避免了這一點。
#include #include #include #include #include #include using namespace std;
#define inf 0x3fffffff
#define n 505
#define m 55
int n,m,p;
int t[n][m],fail[n],top;
bool flag[n];
char word[m],s[m];
struct dpdp[m][n];
int res[100];
maphh;
queueq;
void init()
return 0;
}
POJ1625 AC自動機 DP 大數
題解 跑一遍ac自動機,後直接在上面dp一維表示字元長度二維表示處於那個結點最後標記一下那些位置是危險結點不要轉移過去即可,由於這題資料很大又沒有取膜所以要用大數相加 include include include include includeusing namespace std const i...
poj 1625 (AC自動機好模版,大數好模版)
題目 給n個字母,構成長度為m的串,總共有n m種。給p個字串,問n m種字串中不包含 不是子串 這p個字串的個數。將p個不能包含的字串建立ac自動機,每個結點用val值來標記以當前節點為字尾的字串是否包含非法字串 p個字串中的任何乙個 狀態轉移方程 f i,j f i 1,k f i,j 表示長度...
pku1625 AC自動機,動態規劃
我是dp菜。而且這是第一次寫ac自動機,以前ac自動機只是停留在理論階段,雖然寫過幾次trie,但是這樣完整的ac自動機還是第一次寫。其實ac自動機就是乙個樹形kmp,fail指標都那麼像 其實kmp裡頭我叫p陣列,並且我現在還不會擴充套件kmp,只會樸素kmp和字尾陣列,所以我是字串菜,很多東西都...